Awk 匹配字符串,但仅匹配其下方的输出行+;不是匹配的字符串本身

Awk 匹配字符串,但仅匹配其下方的输出行+;不是匹配的字符串本身,awk,grep,Awk,Grep,我需要找到一种方法来选择指定字符串下面的行,在本例中,是包含函数“y”的字符串-但我不想选择字符串“y”本身,以防有多行与“y”在一起 所以我基本上想要的是选择所有包含“new o”的行,但我不想选择一个位于字符串“y”()正上方的“new 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);

我需要找到一种方法来选择指定字符串下面的行,在本例中,是包含函数
“y”
的字符串-但我不想选择字符串
“y”
本身,以防有多行与
“y”
在一起

所以我基本上想要的是选择所有包含
“new o”
的行,但我不想选择一个位于字符串
“y”(
)正上方的“new 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);
我如何继续做这样的事情?
我试图找到重复的问题,但我不完全确定要搜索什么,如果是重复的,我道歉

提前感谢。

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);

如果perl也可以作为一个选项,那么试试这个

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

perl-0777-ne'while(/y\(.+?\n(?)不清楚。
new o86=x(-1.3);
就在
y(
)下面,为什么选择它?因为它不在
y(
)的正上方,所以它与
y没有“连接”(
可以这么说。嘿,谢谢你的回答,两人似乎都选择了包含
新o*
的所有行,包括我不想包含的行。grep(GNU grep)3.0是的,这正是我想要的-当我运行
awk
解决方案时,它根本不会给我任何输出。好的,我尝试了你的
grep-zoP'new o.*(\n |$)(?!y\)“
删除我要搜索的文件中的冗余字符串后的解决方案,该字符串似乎有效。Windows 10,不,该文件有点不同,在每一行前面都有执行该文件的调试信息,例如;
[01:45:47]
,我刚刚注册了这些,我能够使用您的grep解决方案,非常感谢。
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);
$