строка соответствия, но только выходные строки под ней + не соответствующая строка - PullRequest
0 голосов
/ 19 января 2019

Мне нужно найти способ выделить строки ниже указанной строки, в данном случае строку, содержащую функцию "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);

Как бы я продолжил делать что-то подобное?
Я пытался найти повторяющиеся вопросы, но я не был полностью уверен, что искать, если он дублируется, я прошу прощения.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Если 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);
$
0 голосов
/ 19 января 2019

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}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...