在 Perl 模式下使用 grep 跳过输出中的文本

在 Perl 模式下使用 grep 跳过输出中的文本

我有这样的文字:

blah, blah <foo:ImportantText> blah blah time=1.234 blah blah
blah, blah <foo:AlsoImportant> blah blah blah time=9.9 blah blah
blah, blah <foo:ImportantText> blah blah time=0.987 blah blah

我想得到:

<foo:ImportantText>=1.234
<foo:AlsoImportant>=9.9
<foo:ImportantText>=0.987

我用这条线:

grep -Po '(<foo:.+>).+time=(\d+.\d+)' logfile.txt
  • 请注意,我不需要担心误报,因为<foo:time=不会出现在文本的其他地方。也是blah blah随机文本,而不是文字。

这给了我:

<foo:ImportantText> blah blah time=1.234
<foo:AlsoImportant> blah blah blah time=9.9
<foo:ImportantText> blah blah time=0.987

如何删除中间文本?我以为'(<foo:.+>)(?=.+time)=(\d+.\d+)'可能有用,但事实并非如此。

更新:

grep -Po '(<foo:.+>).+time=(\d+.\d+)' logfile.txt
                | awk -F ' ' '{print $1substr($NF,4)}'

这可行,但是有grep唯一的解决方案吗?

答案1

更好地使用 sed:

$ sed -E 's/.*(<foo:.+>).+time=([0-9.]+).*/\1=\2/' logfile.txt 
<foo:ImportantText>=1.234
<foo:AlsoImportant>=9.9
<foo:ImportantText>=0.987

相关内容