【问题标题】:Matching pattern span multiple line and remove those matching lines匹配模式跨越多行并删除那些匹配行
【发布时间】:2012-01-27 22:26:23
【问题描述】:

我试图使用 sed 执行以下操作:

在文件中看起来像:

 第一行
 二线EEE
 AAAblablabla
 ForthLineEEE
 第五线
 最后一行

我想删除 EEE(但保留第二行的其余部分)和以 AAA 开头的整行,并保持文件的其他部分完好无损。

预期的结果是(如所见,如果下面的行不以AAA开头,它将被保留,这就是我需要匹配多行的原因。)

 第一行
 第二行
 ForthLineEEE
 第五线
 最后一行

我该怎么做?提前致谢!

【问题讨论】:

    标签: sed pattern-matching


    【解决方案1】:

    也许这可行 -

    sed '/EEE$/N;s/\(.*\)EEE\nAAA.*/\1/' filename
    

    测试:

    [jaypal:~/Temp] cat file
    FirstLine
    SecondLineEEE
    AAAblablabla
    ForthLineEEE
    FifthLine
    LastLine
    
    [jaypal:~/Temp] sed '/EEE$/N;s/\(.*\)EEE\nAAA.*/\1/' file
    FirstLine
    SecondLine
    ForthLineEEE
    FifthLine
    LastLine
    

    【讨论】:

      【解决方案2】:

      这可能对你有用:

      echo -e "FirstLine\nSecondLineEEE\nAAAblablabla\nLastLine" |
      sed '/EEE$/{N;s/EEE\nAAA.*//}'
      FirstLine
      SecondLine
      LastLine
      

      【讨论】:

      • 是的,这适用于示例案例!但是,在我的真实案例中,EEE实际上是&,我尝试了\&和“&”,似乎无法匹配它。有什么想法吗?
      • 如果我用&\& 代替EEE 我仍然匹配,也许行尾还有其他内容。尝试\&\s*\n\s*AAA 或在N 命令之后使用l 命令,即N;ls/\&\s*\n\s*AAA.*//`祝你好运!
      【解决方案3】:
      fge@erwin ~ $ sed '/EEE$/d; /^AAA/d' <<EOF
      > FirstLine
      > SecondLineEEE
      > AAAblablabla
      > LastLine
      > EOF
      FirstLine
      LastLine
      

      /re/d 将从输入匹配正则表达式re 中删除所有行。根据您的需要调整模式。

      【讨论】:

      • 抱歉,实际上我想保留第二行的其余部分。但我会尝试自己更改您的命令。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多