【问题标题】:find lines between two patterns using sed使用 sed 查找两个模式之间的线
【发布时间】:2013-01-15 08:50:03
【问题描述】:

我在 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”开始?

【问题讨论】:

    标签: sed


    【解决方案1】:

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

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

    【讨论】:

    • 我做了一些搜索来理解这一点,如果我错了,请纠正我:1,转义尖括号是可选的,这表明我们正在寻找的是单词。 2、'h'命令表示将模式空间保存到保持缓冲区中,'H'表示将模式空间追加到保持缓冲区中,'x'表示交换模式空间和保持缓冲区。 3、整个命令会先选择从第一行开始包含'abc'到后面结束的范围,第一行包含'efg',然后在每个范围内找到最后一行包含'abc',并保存后面的行直到该行包含'efg',然后打印它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多