是否有可能在没有perl支持的情况下执行后面的查看并在grep中查看断言?

时间:2013-10-18 15:59:56

标签: regex awk grep

或许像vi一样?

我的Perl等价物是:

grep -Po '(?<=^.L.........\s).*(?=\s->\s)' rsync_itemized.log

找到所有符号链接修改并输出文件名部分。显然,我可以使用awk:

awk '$1 ~ /^.L........./ { print $2 }' rsync_itemized.log

但我想知道greps本地正则表达式引擎是否支持它。

1 个答案:

答案 0 :(得分:1)

一些注意事项:

  • grep -P使用libpcre,一个已编译的库(用C语言编写,而不是perl),与perl- 兼容
  • 如果文件名中有空格,则awk命令将无效。

这个sed命令会更好一点:

sed '/^.L......... /!d; s///; / -> .*/!d; s///'

这将删除与第一个正则表达式不匹配的所有行,然后删除其余行的匹配部分,然后对第二个正则表达式执行相同的操作,在中间留下文本。由于正则表达式为greedy,因此即使您需要a -> b -> c,第二个正则表达式也会将a变为a -> b,因此这也不是一个完美的解决方案。

也许你可以直接使用perl(我假设你是在没有libpcre库的情况下编译grep的系统,因此不能-P但是你仍然可以有权访问perl):

perl -ne '/^.L.........\s(.*)\s->\s/ and print "$1\n"'

这一次,贪婪对我们有利(正则表达式从左到右评估),您将正确提取一个名为a -> b的文件,该文件符号链接到c

如果您有GNU sed(几乎所有Linux系统),您可以模仿该逻辑:

sed '/^.L.........\s\(.*\)\s->\s.*/!d; s//\1/'

但我在技术上没有回答你的问题,即关于在没有grep的情况下使用-Pgrep使用basic and extended POSIX regular expressions(BRE和ERE)。即使ERE也无法满足您的需求,因此快速回答是您不能在没有grep的单-P命令中执行此操作。您可以使用多个grep命令来执行此操作,但它会非常难看,我倾向于说如果没有环视或文本替换,您实际上无法执行此操作,BRE或ERE。