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
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" = < ...