像grep一样的Perl一行命令?

19

请参阅 perlrun 手册。 - Eugene Yarmash
2
如果你只想使用Perl正则表达式进行grep,那么可以使用ack(通过安装App::ack发行版)。 - mob
1
@Harmen 有些东西只能与 Perl 兼容,而不是真正的正则表达式,比如负向后瞻断言。 - Jayen
@Jayen 什么使得 Perl 兼容只是真正的正则表达式? - barlop
不确定我是否理解您的问题@barlop,但也许这可以帮助您:http://en.m.wikipedia.org/wiki/Regular_expression#Patterns_for_non-regular_languages - Jayen
显示剩余4条评论
3个回答

35
(echo a; echo b; echo c) | perl -ne 'print if /a/'

如果你需要两个条件,可以尝试使用 | perl -ne 'print if /a/ || /b/' 或者 | perl -ne 'print if /(a|b)/'。在一个5GB的CSV文件中,捕获组大约快了10%。在普通大小的数据上,差异是无法察觉的。我发现使用 || 的“或”风格更易读。 - djeikyb

5

2
ack是Perl编写的,但包装得非常漂亮。 - Joel Berger
这是关于ack '^\S+foo\s'perl -wlne 'm{^\S+foo\s} and print'之间的区别——每次使用ack而不是perl时,可以节省大约20个字符。此外,当Perl显示结果时,它不使用任何颜色,而ack会像grep一样着色输出。 - Noah Sussman
2
@NoahSussman 有趣.. 我对sed的“s…”即替换有两个问题,它是逐行处理的,并且没有二进制模式。我猜ack没有这些限制?此外,ack能否超越sed打印第n行的能力 (echo a & echo b) | sed -n "2p" - barlop

2
如果您有其他选择并且能负担得起,您也可以使用Ruby完成同样的操作。
$ (echo a; echo b; echo c) | ruby -ne 'print if /a/'
a
$ (echo a; echo b; echo c) | ruby -ne 'print if $_["a"]'
a

2
谢谢提示。我正在寻找一些用于shell one-liners的东西 - Python 太笨重了,即使是 Py2 也是。很高兴知道,Ruby 在这方面像它的父亲 Perl 一样。 - Tomasz Gandor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接