我想删除目录中所有文件中两个字符串之间的所有文本。例如,文件看起来像这样:
flag
bla bla bal
bla bla bla
endflag
etc..
这就是我在用sed做的事情:
sed -i "s:flag.*endflag::m" *
但是,'m'选项不是sed的一部分。本主题中的所有其他Stack Overflow线程都使用perl,awk或sed包装器来实现此目的。有没有办法告诉sed匹配换行符?
答案 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