如何解决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)?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。