sed - 使用 sed 查找两个模式之间的线

标签 sed

我在 text.txt 中有如下几行:

blah blah..
blah abc blah..
blah abc blah
blah blah..
blah blah..
blah blah..
blah efg blah blah
blah blah..
blah abc blah
blah abc blah
blah abc blah
blah abc blah
blah abc blah
blah blah..
blah efg blah blah
blah blah..
blah blah..

我想在“efg”和“efg”之前输出最后一次出现的“abc”之间的行,对于上面的例子,我想输出:
blah abc blah
blah blah..
blah blah..
blah blah..
blah efg blah blah
blah abc blah
blah blah..
blah efg blah blah

我知道 sed 可以使用两种模式选择范围,例如:
sed -n '/abc/,/efg/p' test.txt

但是,输出将从第一次出现“abc”而不是最后一次开始,输出如下:
blah abc blah..
blah abc blah
blah blah..
blah blah..
blah blah..
blah efg blah blah
blah abc blah
blah abc blah
blah abc blah
blah abc blah
blah abc blah
blah blah..
blah efg blah blah

我可以在命令行上进行任何增强,以便输出将从最后一次出现的“abc”开始?

最佳答案

这可能对你有用(GNU sed):

sed -n '/\<abc\>/,/\<efg\>/{/\<abc\>/{h;d};H;/\<efg\>/{x;p}}' file

关于sed - 使用 sed 查找两个模式之间的线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14334032/

相关文章:

regex - 删除重复的文件扩展名

perl - 自动将指定文件插入另一个文件(使用 sed、AWK 或 Perl)

linux - 如何在行尾负 1 位置添加带有 sed 的文本

linux - 适用于 Solaris、Linux 和 HPUX 的 sed 命令

linux - 使用/删除文本文件中包含特定字符串的行

linux - 如何使用 sed 替换包含整数的行

linux - 使用打印命令选择子域

sed - 如何使用sed查找和替换除第一个匹配项之外的每个匹配项?

unix - 删除给定字符后的第一个字符

perl - 在单次迭代中提取同一模式第一次出现和最后一次出现之间的所有内容