如何仅通过一次调用就提取两个模式之间的文本(可能包含浮动后视)?

如何仅通过一次调用就提取两个模式之间的文本(可能包含浮动后视)?

xxx<1+ whitespaces>"我尝试匹配和之间的任何字符(换行符除外)whitespace

输入字符串的格式如下:

xxx<1+ whitespaces>"yyy<1+ whitespaces>zzz"

我尝试使用以下 PCRE:

$ echo 'xxx  "yyy zzz"' | grep -Po '(?<=\xxx\s+").*?(?=\s)'
grep: lookbehind assertion is not fixed length

然而,正如我们所见,PCRE 不支持浮动后视,因为这可能会导致严重的性能问题

解决方法如下:

$ echo 'xxx  "yyy zzz"' | grep xxx | grep -Po '(?<=").*?(?=\s)'
yyy

这里我们看到它是起作用的,但是grep被调用了两次,这可能被认为是次优的。

是否只需一次grep调用就能达到相同的结果?

如果没有,那么是否有可能实现相同的结果,但只需一次<toolname>(可能awk)调用?

答案1

使用重置运算符:\K

$ echo 'xxx  "yyy zzz"' | grep -Po 'xxx\s+"\K.*?(?=\s)'
yyy

相关内容