假设我有一个名为'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
但这行不通。
感谢任何指导。
编辑:
如果我有这个文件,awk
命令会如何变化?
>reference1
AGTCTGCAFOOHAPPYBARGTACAC
>reference2
GTACAFOOBIRTHDAYBARGACCAT
预期输出:
>reference1
HAPPY
>reference2
BIRTHDAY
最佳答案
Grep解决方案
grep -zPo '(foo)\K(\w+(?=bar))|.*(?=\n(?1)(?2))' | tr '\0' '\n'
Perl 解决方案
perl -nE '/^foo(.*)bar$/&&say$p.$1;$p=$_'
关于regex - 使用 Grep 在匹配之前获取捕获组和行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53086715/