perl命令行执行一次衬线查找/替换,但是*不*打印不匹配的行?

问题描述

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

是否存在perl命令行单行代码,该命令行代码不会打印不匹配的行?我知道perl -pe s/foo/bar/ if /foo/,但是接下来我需要复制正则表达式。是否可以不重复自己?

解决方法

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

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

或者,等效地:

perl -ne 'print if s/foo/bar/'
,

@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: command line switches
What should every Perl hacker know about perl -ne?

要在各种用例中查看这些命令行开关,包括一些出色的Perl单行代码,请参阅:
What is your latest useful Perl one-liner (or a pipe involving Perl)?