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

関連情報