匹配字符串,但仅包含其下的输出行,而不匹配字符串本身

时间:2019-01-19 11:55:31

标签: awk grep

我需要找到一种方法来选择指定字符串下方的行,在这种情况下,该字符串包含函数"y"-但我不想选择字符串"y"本身,如果"y"下方有多行。

所以我基本上想要选择包含"new o"的所有行,但是我不想选择字符串"y("上方的“新o”,这就是我到了。

我有一个包含此文件的文件;

new o85 = x(-1.3);
y(o85, 12.0, 91.2, 5);
y(o85, 12.0, 91.2, 6);
y(o85, 12.0, 91.2, 7);
new o86 = x(-1.3);
new o87 = x(-1.3);
y(o87, 12.0, 91.2, 9);
new o88 = x(-1.3);
new o89 = x(-1.3);
new o90 = x(-1.3);
y(o90, 12.0, 91.2, 3);
new o91 = x(-1.3);
new o92 = x(-1.3);
new o93 = x(-1.3);
new o94 = x(-1.3);
new o95 = x(-1.3);
new o96 = x(-1.3);
y(o96, 12.0, 91.2, 3);
new o97 = x(-1.3);
new o98 = x(-1.3);
new o99 = x(-1.3);

我要选择这些特定行;

new o86 = x(-1.3);
new o88 = x(-1.3);
new o89 = x(-1.3);
new o91 = x(-1.3);
new o92 = x(-1.3);
new o93 = x(-1.3);
new o94 = x(-1.3);
new o95 = x(-1.3);
new o97 = x(-1.3);
new o98 = x(-1.3);
new o99 = x(-1.3);

我该如何继续做这样的事情?
我试图找到重复的问题,但是我不确定要搜索什么,如果重复,我表示歉意。

谢谢。

2 个答案:

答案 0 :(得分:0)

GNU grep:

grep -zoP 'new o.*?(\n|$)(?!y\()'

或者这个:

grep -zoP 'new o.*?;(?!\ny\()'

GNU awk:

$ awk -v RS="\n*y[^)]*);\n*" -F"\n" 'NF>1{for(i=1;i<NF;i++) print $i}' file
new o86 = x(-1.3);
new o88 = x(-1.3);
new o89 = x(-1.3);
new o91 = x(-1.3);
new o92 = x(-1.3);
new o93 = x(-1.3);
new o94 = x(-1.3);
new o95 = x(-1.3);
new o97 = x(-1.3);
new o98 = x(-1.3);

对于Windows回车(\r\n)结束文件:

awk -v RS="[\r\n]*y[^)]*);[\r\n]*" -F"[\r\n]+" 'NF>1{for(i=1;i<NF;i++) print $i}'

答案 1 :(得分:0)

如果还可以选择perl,请尝试此操作

perl -0777 -ne ' while ( /y\(.+?\n(?<!=y)((?-s:^new.+?\n)+)(?<!=y)(new.+?\n)(?=y\(|\Z)/mgs ) { print "$1" } '

您的输入

$ cat yoranus.txt
new o85 = x(-1.3);
y(o85, 12.0, 91.2, 5);
y(o85, 12.0, 91.2, 6);
y(o85, 12.0, 91.2, 7);
new o86 = x(-1.3);
new o87 = x(-1.3);
y(o87, 12.0, 91.2, 9);
new o88 = x(-1.3);
new o89 = x(-1.3);
new o90 = x(-1.3);
y(o90, 12.0, 91.2, 3);
new o91 = x(-1.3);
new o92 = x(-1.3);
new o93 = x(-1.3);
new o94 = x(-1.3);
new o95 = x(-1.3);
new o96 = x(-1.3);
y(o96, 12.0, 91.2, 3);
new o97 = x(-1.3);
new o98 = x(-1.3);
new o99 = x(-1.3);
$ perl -0777 -ne ' while ( /y\(.+?\n(?<!=y)((?-s:^new.+?\n)+)(?<!=y)(new.+?\n)(?=y\(|\Z)/mgs ) { print "$1" } ' yoranus.txt
new o86 = x(-1.3);
new o88 = x(-1.3);
new o89 = x(-1.3);
new o91 = x(-1.3);
new o92 = x(-1.3);
new o93 = x(-1.3);
new o94 = x(-1.3);
new o95 = x(-1.3);
new o97 = x(-1.3);
new o98 = x(-1.3);
$