使用Grep在比赛前获取捕获组和行

时间:2018-10-31 15:16:39

标签: regex linux perl grep

假设我有一个名为'test.txt'的文件:

>reference1
fooHappybar
>reference2
fooBirthdaybar

我需要一个grep命令,该命令将捕获foobar之间的字符串以及匹配项正上方的行。该命令应显示以下输出:

>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

但这不起作用。

任何指导表示赞赏。

编辑:

如果我拥有此文件,awk命令将如何更改?

>reference1
AGTCTGCAFOOHAPPYBARGTACAC
>reference2
GTACAFOOBIRTHDAYBARGACCAT

预期输出:

>reference1
HAPPY
>reference2
BIRTHDAY

3 个答案:

答案 0 :(得分:5)

Grep解决方案

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

Perl解决方案

perl -nE '/^foo(.*)bar$/&&say$p.$1;$p=$_'

答案 1 :(得分:1)

恐怕仅使用grep是不可能的。 原因是-o禁用-B。

  

在匹配的行之前打印前导上下文的NUM行。在连续的匹配组之间放置包含组分隔符(-)的行。使用-o或--only-matching选项,此选项无效,并给出警告。

答案 2 :(得分:1)

您可以使用此awk

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

>reference1
HAPPY
>reference2
BIRTHDAY