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

多行sed选项?

  •  0
  • nnyby  · 技术社区  · 14 年前

    我要删除目录中所有文件中两个字符串之间(包括两个字符串)的所有文本。例如,文件如下所示:

    flag
    bla bla bal
    bla bla bla
    endflag
    
    etc..
    

    sed -i "s:flag.*endflag::m" *
    

    但是,“m”选项不是sed的一部分。本主题中的所有其他堆栈溢出线程都求助于使用perl、awk或sed包装器来实现这一点。有没有办法告诉sed匹配换行符?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Mark Byers    14 年前

    在sed中,可以指定一系列线,其中范围是标记范围起点的图案和标记范围终点的另一个图案:

    sed -i '/flag/,/endflag/d' *
    
        2
  •  2
  •   Dennis Williamson    14 年前

    对中的范围说明符使用备用分隔符 sed

    sed -i '\:<form:,\:</form>:d' *.aspx *.htm *.html
    
        3
  •  1
  •   fschmitt    14 年前

    必须先将文本复制到保留缓冲区,然后才能像其他字符一样匹配。通常,一次只有一行在保留缓冲区中,因此\n永远不是所分析字符串的一部分。下面的调用首先将第一行复制到保持缓冲区(1h),然后将下面的所有行追加到保持缓冲区(1!H) 在添加最后一行($)之后,进行替换(s/)。

    sed -n '1h;1!H;${;g;s/flag.*endflag\n//g;p;}' foo.txt