regex - 使用 Grep 在匹配之前获取捕获组和行

标签 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

最佳答案

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/

相关文章:

regex - 如何在 Vim - Regex 中为数字添加引号?

c++ - 使用 autoconf 从二进制文件生成对象 (.o) 的自定义命令

Python 多处理和全局变量

c# - 如果公司使用 C++、C# 或 Java 作为应用程序语言,为什么要学习 Perl、Python、Ruby?

regex - Perl 正则表达式 : Question mark isn't greedily matching

regex - 如果找到相同的单词,命令 egrep 提取一行

mysql - MySQL Regexp 是否支持 Unicode 匹配

regex - 正则表达式-两位数范围(23-79)?

linux - sed 命令替换特定字节位置的字符

regex - Perl/Sed 命令多次替换相同的模式