2

也许像vi?

我的 perl 等价物是:

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

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

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

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

4

1 回答 1

1

几点注意事项:

  • grep -P使用libpcre ,一个与 perl兼容的编译库(用 C 编写,而不是 perl)
  • 如果文件名中有空格,您的awk命令将不起作用

这个sed命令会更好一点:

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

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

也许你可以perl直接使用(我假设你在一个grep没有 libpcre 库的系统上编译,因此不能这样做-P,但也许你仍然可以访问perl):

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

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

如果你有GNUsed(几乎所有 Linux 系统),你可以模仿这个逻辑:

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

 

但我没有从技术上回答你的问题,即关于使用grepwithout -P. grep使用基本和扩展的 POSIX 正则表达式(BRE 和 ERE)。即使 ERE 也无法执行您要查找的操作,因此快速回答是,如果grep没有-P. 您可能可以使用多个grep命令来执行此操作,但这会非常难看,我倾向于说您实际上无法在没有环视或文本替换的情况下执行此操作,这在 BRE 或 ERE 中都不可用。

于 2015-12-02T17:55:15.257 回答