多线sed选项?

时间:2010-09-28 19:13:15

标签: sed replace

我想删除目录中所有文件中两个字符串之间的所有文本。例如,文件看起来像这样:

flag
bla bla bal
bla bla bla
endflag

etc..

这就是我在用sed做的事情:

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

但是,'m'选项不是sed的一部分。本主题中的所有其他Stack Overflow线程都使用perl,awk或sed包装器来实现此目的。有没有办法告诉sed匹配换行符?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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