使用Grep在匹配前获取Capture Group和Line

coo*_*490 -1 regex linux perl grep

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

>reference1
fooHappybar
>reference2
fooBirthdaybar
Run Code Online (Sandbox Code Playgroud)

我需要一个grep命令,将捕获的字符串foobar线直接在比赛上面,和.该命令应该导致以下输出:

>reference1
Happy
>reference2
Birthday
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止:

grep -oP 'foo\K\w+(?=bar)' test.txt
Run Code Online (Sandbox Code Playgroud)

这使:

Happy
Birthday
Run Code Online (Sandbox Code Playgroud)

我知道grep -B 1在比赛前输出比赛和线路.我试过了:

grep -oP -B 1 'foo\K\w+(?=bar)' test.txt
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

任何指导表示赞赏.

编辑:

awk如果我有这个文件,命令将如何改变?

>reference1
AGTCTGCAFOOHAPPYBARGTACAC
>reference2
GTACAFOOBIRTHDAYBARGACCAT
Run Code Online (Sandbox Code Playgroud)

预期产量:

>reference1
HAPPY
>reference2
BIRTHDAY
Run Code Online (Sandbox Code Playgroud)

Nah*_*eul 5

Grep解决方案

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

Perl解决方案

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