我想用bash
获取多行模式我有一个使用cmd | tee >(grep 552) | grep 210
的方法可以工作,但它会吐出所有的552,然后是所有的210。如果用相应的210's吐出成对的552,它会更容易阅读。
这是我在python中的方式,但我还没弄明白如何在bash中做到这一点。可能是一些awk / grep命令?
Python示例:
(552)(.*)(.|\n|\r)*?(210)(.*)
或者指定非捕获,将是:
(?:552)(.*)(?:.|\n|\r)*?(?:210)(.*)
示例输入:
properties 552 I want
220 a logg don't want this
props 210 These
...
552 And these
...
ex 210 too
示例输出:
I want
These
And these
too
也没关系:
properties 552 I want
props 210 These
552 And these
ex 210 too
答案 0 :(得分:1)
看起来,您可以使用sed
进行更改:
sed -nE 's/^.*(552|210) *//p' file
I want
These
And these
too
如果这不是您正在寻找的内容,那么我建议您发布预期输出的不同样本输入。
答案 1 :(得分:0)
考虑这个示例输入文件:
$ cat file
552 Start1
123 other
210 End1
123 other
123 other
552 Start2
210 End2
$ awk '/552/,/210/' file
552 Start1
123 other
210 End1
552 Start2
210 End2
$ sed -n '/552/,/210/p' file
552 Start1
123 other
210 End1
552 Start2
210 End2
$ grep -ozP '552(.|\n|\r)*?210[^\n]*\n' file
552 Start1
123 other
210 End1
552 Start2
210 End2
答案 2 :(得分:0)
如果您不需要开始和结束模式之间的界线
$ awk '/^552\y/ && ORS=OFS;
/^210\y/ && ORS=RS' file
将给出(使用@ John1024'输入文件)
552 Start1 210 End1
552 Start2 210 End2
或者,如果你想要它们在不同的行上
$ awk '/^552\y/ || /^210\y/'
552 Start1
210 End1
552 Start2
210 End2
如果你正在寻找第一场的确切文字匹配,也许写$1=="552" || $1=="210"
会更好。