【问题标题】:sed to remove content between two patterns [duplicate]sed 删除两个模式之间的内容
【发布时间】:2012-09-25 16:19:10
【问题描述】:

可能重复:
Extract data from HTML table with BASH script

我有一个包含以下内容的 html 文件。我想使用 sed 删除模式 < script ..... ></script> 之间的所有内容(多行),其余部分保持原样。我也想去掉标签。

任何帮助将不胜感激。谢谢! 我尝试了以下两种方法,但都没有成功。

cat test.html | tr -d '\n' | sed 's/< script.*<\/script>//g' > output.txt

sed '/< script/,/<\/script>/d' test.html > output.txt    

don't touch this.

this is not to be removed < script bla bla> this is to be

removed. < /script> this is going to

stay < script bla bla bla bla bla> remove this

and this 

and this < /script> and this stays as is.

this too.

【问题讨论】:

  • &lt;script&gt;&lt;/script&gt; 会出现在同一行吗?
  • 显然是 * 上第二受欢迎的问题 - “如何删除 .. sed .. 在两个模式之间?” :) *.com/search?q=sed+patterns

标签: regex bash text sed


【解决方案1】:

怎么样:

cat yourfile | tr -d '\n' | sed -e 's,< script.*< /script>,,g'

注意结束标签中的空格

【讨论】:

  • 无用使用cat (tr -d '\n' yourfile)。而且您正在使用贪婪的正则表达式,因此它可以删除您可能希望保持不变的内容。并看到这个答案:*.com/a/1732454/11621
  • cat(或 tr
【解决方案2】:

这可能对你有用(GNU sed):

sed ':a;$!{N;ba};/\x00/q1;s/<\s*\/\?script[^>]*>/\x00/g;s/\x00[^\x00]*\x00//g' file

它可能会失败,因为 HTML 文件包含十六进制代码 \x00,在这种情况下,返回代码将为 1,并且文件输出将保持不变。

解释:

  • :a;$!{N;ba} 将文件 slurp 到模式空间中
  • /\x00/q1 检查文件中的十六进制代码 \x00,如果发现退出并返回代码 1
  • s/&lt;\s*\/\?script[^&gt;]*&gt;/\x00/g 将所有 script 开始和结束标签替换为 \x00
  • s/\x00[^\x00]*\x00//g 删除 \x00 之间的所有内容

【讨论】: