Grep

在 perl 模式下使用 grep 跳過輸出中的文本

  • August 31, 2018

我有這樣的文字:

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-only 解決方案?

更好地使用 sed:

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

引用自:https://unix.stackexchange.com/questions/465636