Sed脚本 - 删除行

时间:2013-01-24 20:43:10

标签: regex sed

我的sed脚本需要帮助。我有一个XML文件,我必须删除除这些标记中包含的文本之外的所有内容:

<TEXT>......</TEXT>
<HEADLINE>......</HEADLINE>

如何编写sed代码?我知道如何删除除ONE标签中所包含的文本之外的所有内容。

s/.*<TEXT>\(.*\)<\/TEXT>.*/\1/

但是我如何编写许多标签的sed代码?

3 个答案:

答案 0 :(得分:1)

您可以将多个命令传递给sed

$ echo '<TEXT>Hello</TEXT>
<HEADLINE>there</HEADLINE>' | sed -n 's/.*<TEXT>\(.*\)<\/TEXT>.*/\1/gp; s/.*<HEADLINE>\(.*\)<\/HEADLINE>.*/\1/gp' 
Hello
there

但是在将regex应用于类似XML的文件时,你真的应该小心。

答案 1 :(得分:1)

假设您有有效的XML:

sed '/.*<\(TEXT\|HEADLINE\)>\(.*\)<\/\(TEXT\|HEADLINE\)>.*/!d;s//\2/' yourfile.xml

如果您想使用 sed 脚本,请添加以下行:

/.*<\(TEXT\|HEADLINE\)>\(.*\)<\/\(TEXT\|HEADLINE\)>.*/!d;s//\2/

然后运行:

sed -f yourscript.sed < yourfile.xml

答案 2 :(得分:0)

这可能适合你(GNU sed):

 sed -r '/<(text|headline)>/I!d;s//&\n/;s/^[^\n]*\n//;:a;/<\//!{$!{N;ba}};s/\n/ /g;s/<\//\n&/;P;D' file

这将删除TEXTHEADLINE标记之间的所有文本接受,并在多行值上用空格替换换行符。