【问题标题】:perl one-liner like grep?perl 单线像 grep?
【发布时间】:2011-06-15 05:09:07
【问题描述】:

我想让 perl 做一个像 grep 这样的单行代码

有点像这样,但我不确定要添加什么才能使其正常工作

$ (echo a ; echo b ; echo c) | perl -e 'a'

添加 我在这里的回答涵盖了更多内容
https://superuser.com/questions/416419/perl-for-matching-with-regex-in-terminal

【问题讨论】:

  • 除非您使用的是无法使用grep 的异常锁定的Linux,否则最好只使用grep :-)
  • 另见perlrun手册页。
  • 如果您只想使用 Perl 正则表达式执行 grep,请使用 ack(通过安装 App::ack 分发版)
  • @Harmen 有些东西只与 perl 兼容,而不是真正的正则表达式,比如否定的后向断言。

标签: linux perl grep


【解决方案1】:

回应暴民的评论:

如果你想使用 Perl 正则表达式,试试 ack: http://betterthangrep.com/

【讨论】:

  • ack 是 perl,但包装得很好很漂亮
  • @barlop 这是ack '^\S+foo\s'perl -wlne 'm{^\S+foo\s} and print' 之间的区别——所以每次我为此使用ack 而不是perl 时大约节省了大约20 个字符。同样,当 Perl 显示结果时,它不使用任何颜色,而 ack 对输出进行着色,类似于 grep。
  • @NoahSussman 很有趣.. 我对 sed 的“s...”有两个问题,即 sed 替换是它是逐行的,没有二进制模式。我猜 ack 没有这些限制?另外,ack 能否击败 sed 打印第 n 行 (echo a & echo b) | sed -n "2p" 的能力?
【解决方案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

【讨论】:

  • 感谢您的提示。我一直在为 shell 单线寻找一些东西——Python 太笨重了,即使是 Py2。很高兴知道,Ruby 在这里继承了它的父亲 Perl。
【解决方案3】:
(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%。在正常尺寸数据上,差异是难以察觉的。我发现||“或”样式更具可读性。
猜你喜欢
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2014-01-14
  • 2021-11-07
  • 2015-11-13
相关资源
最近更新 更多