次のテキストがあります。
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