perl 命令行一个行来做 find/replace,但是 *不* 打印不匹配的行?

perl command line one liner to do find/replace, but *not* print lines that don't match?

我想在命令行上用复杂的正则表达式对文件进行正则表达式查找和替换,所以我需要 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/'

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

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 one-liners,请参阅:
What is your latest useful Perl one-liner (or a pipe involving Perl)?