首页 > 解决方案 > 匹配字符串,但只输出它下面的行+不是匹配的字符串本身

问题描述

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

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

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

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

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

提前致谢。

标签: awkgrep

解决方案


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}'

推荐阅读