3

我想用复杂的正则表达式在命令行上的文件上进行正则表达式查找和替换,所以我需要 PCRE 的 & 正在使用perl -pe "s/foo/bar"(而不是sed),它在应用 之后打印出所有行s///,但它也打印不匹配。

是否有一个perl命令行单行器不会打印不匹配的行?我知道perl -pe s/foo/bar/ if /foo/,但是我需要复制正则表达式。不重复自己有可能吗?

4

2 回答 2

6

您可以使用-nflag(与 不同-p,它不会自动打印所有行)并仅打印与正则表达式匹配的行:

perl -ne 's/foo/bar/ && print'

或者,等效地:

perl -ne 'print if s/foo/bar/'
于 2020-08-14T13:18:58.710 回答
2

@Dada 的答案显示了解决 OP 确切问题的最简洁方法。
下面是一些其他等效但更长的方法来做同样的事情。它们的优点是除了简单地打印行之外,这些单行代码可以更容易地扩展以执行一些其他附加代码(如果需要)。

perl -ne 'if ( s{foo}{bar} ) { print; }'
# Same:
perl -ne 'next LINE unless s{foo}{bar}; print;'

这些可以扩展为:

perl -ne 'if ( s{foo}{bar} ) { some(); other(); code(); print; }'
# Same:
perl -ne 'next LINE unless s{foo}{bar}; some(); other(); code(); print;'

也可以看看:

perlrun: 命令行开关
每个 Perl 黑客都应该了解 perl -ne 什么?

要查看各种用例中的这些命令行开关,包括一些出色的 Perl 单行代码,请参阅:
您最新的有用 Perl 单行代码(或涉及 Perl 的管道)是什么?

于 2020-08-14T15:13:04.600 回答