打印包含模式的行,前面是包含不同模式的另一行



macOS 13.3 Ventura因此BSD版本的grep, awk,等

如何搜索和打印包含图案的行,其中该行必须在包含不同图案的另一行之前?

文本包含像这样的行(用于参考的前导CAPS,…

= =无关的字符)。
...                   # An indeterminate number of lines.
A ... "model" = < ...
...                   # An indeterminate number of lines.
B ... PXS4@0 ...
...                   # An indeterminate number of lines.
C ... "model" = < ...
...                   # An indeterminate number of lines.
D ... PXS2@0 ...
...                   # An indeterminate number of lines.
E ... "model" = < ...
...                   # An indeterminate number of lines.
F ... PXS1@0 ...
...                   # An indeterminate number of lines.
G ... "model" = < ...
...                   # An indeterminate number of lines.
H ... "model" = < ...
...                   # An indeterminate number of lines.

仅限带有"model"前面有PXS[[:digit:]]@0的行应该出现:

C ... "model" = < ...
E ... "model" = < ...
G ... "model" = < ...

在macOS的awk &Grep不支持向后看和向前看。

我认为这将找到一个匹配的PXS…然后找到/打印模型…但是它打印出"A":

awk '/(PXS[[:digit:]]@0 )+?model" = </ { print }'

这个也很接近,但是打印出&;a &;行。因为它打印了&;a &;我不明白为什么它不打印"H"

grep -e ".*PXS[[:digit:]]@0 " -e ".*model" = <"" | grep -v -e ".*PXS[[:digit:]]@0 "

请开导我!

MacOs
perl -n0e 'print $_ =~ /PXS[[:digit:]]@0.*n.*n/g' filename | perl -p -e 's/PXS[[:digit:]]@0[^n]*n//g'

第一步:只留下带有PXS[[:digit:]]@0的行和后面的行。
第二步:删除PXS[[:digit:]]@0

Linux
grep -zoP 'PXS[[:digit:]]@0.*n.*n' filename | sed -z -E 's/PXS[[:digit:]]@0[^n]*n//g'

Grep查找包含PXS[[:digit:]]@0的行和后面的行,sed从输出中删除包含PXS[[:digit:]]@0的行。

你可以试试

awk '/PXS[0-9][@]0/{getline;if(match($0,"model")){ print;}}' 

/PXS[0-9][@]0/将匹配前缀行

getline;将读取下一行(并填充$0)

match($0,"model")将查看该行是否包含regexp 'model'

谢谢你指引我正确的方向。这给了我C、E和g行。

我在awk中使用循环来查找第一行PXS[[:digit:]]@0,并使用子循环来查找第二行"model" = <。该文件是确定性的:如果第一行存在,则第二行将存在(但不是直接在第一行之后)。

我还设置了awk的分隔符,因为我想要的最终值在"model" = <"之后,">之前。

awk -F'<"|">' 'BEGIN {while (getline != 0) if ($0 ~ /PXS[[:digit:]]@0 /) {while (getline != 0) if ($0 ~ /"model" = </){print $2; break;}}}'

我喜欢在一个awk命令中完成所有的事情,我的另一个解决方案需要5个管道greps。

$ awk '/model/ && match(prevline,/PXS[0-9]@0/){print} {prevline=$0}' file
C ... "model" = < ...
E ... "model" = < ...
G ... "model" = < ...

相关内容

  • 没有找到相关文章

最新更新