或许像vi一样?
我的Perl等价物是:
grep -Po '(?<=^.L.........\s).*(?=\s->\s)' rsync_itemized.log
找到所有符号链接修改并输出文件名部分。显然,我可以使用awk:
awk '$1 ~ /^.L........./ { print $2 }' rsync_itemized.log
但我想知道greps本地正则表达式引擎是否支持它。
答案 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
的情况下使用-P
。 grep
使用basic and extended POSIX regular expressions(BRE和ERE)。即使ERE也无法满足您的需求,因此快速回答是您不能在没有grep
的单-P
命令中执行此操作。您可以使用多个grep
命令来执行此操作,但它会非常难看,我倾向于说如果没有环视或文本替换,您实际上无法执行此操作,BRE或ERE。