【问题标题】:Multiline sed option?多行 sed 选项?
【发布时间】:2011-04-18 11:45:09
【问题描述】:

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

flag
bla bla bal
bla bla bla
endflag

etc..

这就是我用 sed 做的事情:

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

但是,'m' 选项不是 sed 的一部分。关于这个主题的所有其他 Stack Overflow 线程都使用 perl、awk 或 sed 包装器来完成此操作。没有办法告诉 sed 匹配换行符吗?

【问题讨论】:

  • sed multiline replace 的可能重复项
  • Colin:该线程对我正在尝试做的事情有部分解决方案: perl -ne 'print if !( m@^
    @ .. m@^
    $@ )' .aspx *.htm */.htm 但这只是将它打印到标准输出。如何在每个文件中使用它来替换?
  • 如果有工具可以让事情变得简单,为什么不使用它们。?为什么一定要坚持sed?

标签: sed replace


【解决方案1】:

在 sed 中,您可以指定一系列行,其中范围是标记范围开始的模式和标记范围结束的另一个模式:

sed -i '/flag/,/endflag/d' *

【讨论】:

  • 嗯,这看起来很有希望,但它不起作用。我正在运行的确切命令是: sed -i '::d' .aspx *.htm */.htm
  • 没关系!当我使用斜杠而不是冒号时,它起作用了。谢谢!
【解决方案2】:

要对sed 中的范围说明符使用备用分隔符,您必须转义第一个分隔符:

sed -i '\:<form:,\:</form>:d' *.aspx *.htm *.html

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-28
      • 2012-09-22
      • 2013-01-19
      • 1970-01-01
      • 2010-11-16
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多