【问题标题】:how to remove CDATA FROM XML FILE using SED (linux)如何使用 SED (linux) 从 XML 文件中删除 CDATA
【发布时间】:2023-04-09 15:52:01
【问题描述】:

我正在尝试从xml 文件中删除以下模式:

  • <![CDATA[
  • ]]>

为此,我使用了来自Remove CDATA tags from XML file 的以下sed 命令:

sed -e 's/<![CDATA[//g' | sed -e 's/]]>//g' file.xml

问题是我无法找到这些模式。它正在重新打印带有图案的整个文本。


<text>
<![CDATA[
ethnic minority communities have been in Belfast since the 1930s.]]>
<\text>

以前的问题

【问题讨论】:

  • 必须是sed吗?我问的原因是因为正则表达式不是处理 XML 的好工具。他们充其量只是肮脏的身体黑客。但这也提出了一个问题——你想在这里完成什么?你能给出想要的输出和输入吗? (从有效的 XML 开始就好)。
  • @Sobrique 我不想使用 XML-TWIG 或 python xml 之类的工具,因为在我的文本中我有类似 & 的符号,当我使用它时会导致错误。这就是我使用 sed 或 grep 的原因。我错了吗?我猜
  • 如果它导致错误,您的 XML 已损坏,您应该拒绝它。您绝对不应该尝试“修复”损坏的 XML,因为您不会尝试使用另一个程序“修复”损坏的程序代码。
  • 好吧,因为我尝试了很多次。如果我在文字游戏中有一个奇怪的符号,我必须重新做所有事情。结构没问题。这是像 和 & 这样的奇怪符号。

标签: xml linux bash sed


【解决方案1】:

我建议使用多功能的XmlStarlet 工具。要删除 CDATA 部分并仅保留文本内容,请使用 this command

xml fo --omit-decl --nocdata file.xml

输出:

<text>
ethnic minority communities have been in Belfast since the 1930s.
</text>

当删除 CDATA 部分(它本身是一种转义机制)时,XmlStarlet 会自动转义在 XML 中具有特殊含义的 & 符号 (&amp;)。像这样的输入文档,

<text>
<![CDATA[
ethnic minorities & communities have been in Belfast since the 1930s.]]>
</text>

会产生这个输出:

<text>
ethnic minorities &amp; communities have been in Belfast since the 1930s.
</text>

【讨论】:

  • 在 debian 风格的 linux 衍生版本上,该命令将在 xmlstarlet 可用,或可通过 apt-get install xmlstarlet 安装。
【解决方案2】:
xml_grep --text_only 'text' intput.xml > output.txt

其中 text 是 xml 元素的名称。

【讨论】:

    【解决方案3】:

    试图回答最初的问题,因为我到了这里却找不到。

    您需要转义表达式中的左方括号,否则您会使用它打开一个字符类。您不需要转义结束 CDATA 部分的字符中的结束字符(因为在正则表达式中没有打开字符类部分),但是为了完整性,您可以而且应该这样做,因为它们在不转义时也具有不同的含义。

    而且 - 顺便说一下 - 你可以告诉 sed 使用多个替换,方法是在表达式中用分号分隔它们:

    sed -e 's/<!\[CDATA\[//g; s/\]\]>//g' file.xml
    

    【讨论】:

      猜你喜欢
      • 2014-10-05
      • 2016-03-28
      • 2021-03-22
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 2015-05-12
      相关资源
      最近更新 更多