首页 > 解决方案 > 使用 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

标签: regexlinuxperlgrep

解决方案


grep 解决方案

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

Perl 解决方案

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

推荐阅读