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

관련 정보