【问题标题】:Sed script - Removing linesSed 脚本 - 删除行
【发布时间】:2013-01-25 15:07:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 为什么不直接使用 XML 解析器?

标签: regex sed


【解决方案1】:

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

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

但是在将正则表达式应用于类似 XML 的文件时,您确实应该小心。

【讨论】:

    【解决方案2】:

    假设您有有效的 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
    

    【讨论】:

    • 但是如何将它添加到脚本文件中?
    • @mrjasmin 我将那部分添加到我的答案中。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 2020-04-02
      • 1970-01-01
      • 2011-02-22
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      相关资源
      最近更新 更多