다음과 같은 텍스트가 있습니다.
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