Получите группу захвата и линию перед совпадением, используя Grep - PullRequest
0 голосов
/ 31 октября 2018

Предположим, у меня есть файл с именем 'test.txt':

>reference1
fooHappybar
>reference2
fooBirthdaybar

Мне нужна команда grep, которая захватит строку между foo и bar и строку непосредственно над совпадением. Команда должна привести к следующему выводу:

>reference1
Happy
>reference2
Birthday

Вот что у меня есть:

grep -oP 'foo\K\w+(?=bar)' test.txt

, что дает:

Happy
Birthday

Я знаю, что grep -B 1 выводит совпадение и строку перед совпадением. Я попробовал:

grep -oP -B 1 'foo\K\w+(?=bar)' test.txt

Но это не работает.

Любое руководство приветствуется.

EDIT:

Как изменилась бы команда awk, если бы у меня был этот файл?

>reference1
AGTCTGCAFOOHAPPYBARGTACAC
>reference2
GTACAFOOBIRTHDAYBARGACCAT

ожидаемый результат:

>reference1
HAPPY
>reference2
BIRTHDAY

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Вы можете использовать это awk:

awk '/FOO.+BAR/{gsub(/.*FOO|BAR.*/, ""); print p ORS $0} {p=$0}' file

>reference1
HAPPY
>reference2
BIRTHDAY
0 голосов
/ 31 октября 2018

Grep раствор

grep -zPo '(foo)\K(\w+(?=bar))|.*(?=\n(?1)(?2))' | tr '\0' '\n'

Решение Perl

perl -nE '/^foo(.*)bar$/&&say$p.$1;$p=$_'
0 голосов
/ 31 октября 2018

Боюсь, это невозможно, только используя grep. Причина в том, что -o отключает -B.

Печать NUM строк начального контекста перед сопоставлением строк. Помещает строку, содержащую разделитель групп (-) между смежными группами совпадений. С опцией -o или --only-match это не имеет никакого эффекта, и выдается предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...