代码之家  ›  专栏  ›  技术社区  ›  Stonecraft

查找并替换跨行的通配符?

  •  0
  • Stonecraft  · 技术社区  · 10 年前

    我想输入如下文本:

    foo
    stuff
    various stuff
    could be anything here
    variable number of lines
    bar
    Stuff I want to keep
    More stuff I want to Keep
    These line breaks are important
    

    把这个拿出来:

     foo
     teststuff
     bar
     Stuff I want to keep
     More stuff I want to Keep
     These line breaks are important
    

    到目前为止,我一直在阅读并使用sed、grep和pcgreep,但未能使其发挥作用。看起来我可能会用Vim做这样的事情,但我以前从未使用过Vim,这看起来像是一种皇室的痛苦。

    我尝试过的东西包括:

    sed -e s/foo.*bar/teststuff/g -i file.txt
    

    pcregrep -M 'foo\s+bar\s' file.txt | xargs sed 's/foo.*bar/teststuff/g'
    

    我不确定是我没有正确使用这些命令,还是我使用了错误的工具。我很难相信没有办法使用终端来查找和替换跨行的通配符。

    3 回复  |  直到 10 年前
        1
  •  1
  •   Ed Morton    10 年前

    为了软件的清晰、简单、健壮、可维护性、可移植性和其他最理想的品质,只需使用awk:

    $ awk 'f&&/bar/{print "teststuff";f=0} !f; /foo/{f=1}' file
    foo
    teststuff
    bar
    Stuff I want to keep
    More stuff I want to Keep
    These line breaks are important
    
        2
  •  1
  •   Cyrus    10 年前

    尝试使用GNU sed:

    sed -e '/^foo/,/^bar/{/^foo/b;/^bar/{i teststuff' -e 'b};d}'
    

    参见: man sed

        3
  •  0
  •   potong    10 年前

    这可能适用于您(GNU sed):

    sed '/foo/,/bar/cteststuff' file
    

    这将取代 foo bar 具有 teststuff .

    然而,你似乎想要的是以下一切 食品 之前 酒吧 ,也许:

    sed '/foo/,/bar/cfoo\nteststuff\nbar' file