【问题标题】:Bash, grep between a line with specified string till a character (not include)Bash,grep 在具有指定字符串的行之间直到一个字符(不包括)
【发布时间】:2016-04-27 06:54:58
【问题描述】:

例子:

> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header bcf and blablabla
some_lines4
some_lines5
> header abc and blablabla
some_lines6
>......

在这里,我想用 'abc' grep 行以及在另一个 '>' 之前的所有行,结果应该是:

> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header abc and blablabla
some_lines6
> ...

由于中间的行数不固定,我不能申请grep -A 我也尝试过使用 sed,但效果不佳:

sed -n '/abc/,/>/p' file

不想要的结果:

> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header bcf and blablabla
> header abc and blablabla
some_lines6

另一个 sed:

sed -n '/abc/,/>/{/abc/b;/>/b;p}' file

不想要的结果:

some_lines1
some_lines2
some_lines3
some_lines6

【问题讨论】:

    标签: string bash awk sed grep


    【解决方案1】:

    使用 GNU grep:

    grep -Poz '^> .*abc.*(\n[^>].*)*' file
    

    输出:

    > header abc and blablabla
    some_lines1
    some_lines2
    some_lines3
    > header abc and blablabla
    some_lines6
    

    【讨论】:

    • 但我的系统似乎不支持 -Poz
    • -z 用于多行 grepping!非常整洁。
    【解决方案2】:

    你可以使用awk:

    awk '/^>/{p=0} /abc/{p=1} p' file
    > header abc and blablabla
    some_lines1
    some_lines2
    some_lines3
    > header abc and blablabla
    some_lines6
    

    【讨论】:

    • @once:这是一个简单的 awk。当我们在一行中找到abc 时,标志p 设置为1,当我们在一行开头找到^ 时,它重置为0。最后拥有p 只是打印或跳过一行,具体取决于它的值是 1 还是 0
    • 这不会为任何包含 abc 的行设置标志,而不仅仅是以 > 开头的行...
    • 我相信这是 OP 想要的,但我们最好从 OP 那里得到更多的澄清。
    【解决方案3】:

    在 sed 中

    sed '/abc/{:1;n;/^>/!b1};d' file
    
    > header abc and blablabla
    some_lines1
    some_lines2
    some_lines3
    > header abc and blablabla
    some_lines6
    

    :1;n;/^>/!b1 是一个循环

    :1 是标签
    n 打印当前行并将下一行加载到模式空间中
    />/! 检查模式空间不包含>,如果不包含则执行下一个命令
    b1 回到循环的开头

    【讨论】:

    • @once 添加解释
    【解决方案4】:

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

    sed '/^>/h;G;/^>.*abc/MP;d' file
    

    这会将标题行存储在保留空间中,然后将标题附加到每一行,并且仅在匹配时打印。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 2019-11-20
      • 2014-04-27
      • 2012-10-18
      相关资源
      最近更新 更多