【问题标题】:Remove non UTF-8 characters from an XML file, using sed使用 sed 从 XML 文件中删除非 UTF-8 字符
【发布时间】:2015-05-12 01:06:48
【问题描述】:

使用 UTF-8 声明为编码的给定 XML 文件未通过 xmllint。假设非 UTF-8 字符导致错误,以下sed 命令正在针对该文件运行。 sed 's/[^\x00-\x7F]//g' file.xml。命令错误,或者非 UTF-8 字符不是问题,因为在运行 sed 后,xmllint 仍然失败。第一个问题是:sed 正则表达式是否正确?

= = = = =

这是xmllint 的输出: $ xmllint file.xml file.xml:35533: parser error : CData section not finished <p class="imgcont"><img alt="Diets of 2013" src="h <b>What You Eat: </b>Foods low in sugar and carbs and high in fat—80% of cal ^ file.xml:35533: parser error : PCDATA invalid Char value 31 <b>What You Eat: </b>Foods low in sugar and carbs and high in fat—80% of cal ^ file.xml:35588: parser error : Sequence ']]>' not allowed in content as.people.com/2013/11/07/kerry-washington-pregnant-diet-green-smoothie-recipe/"] ^

= = = = =

更新:在 TextMate 中,查看文件时,有一个字符显示为 &lt;US&gt;。如果从文件中手动删除该字符,则文件将传递xmllint

【问题讨论】:

  • 字符&lt;US&gt; 是代码点\x1f。 xmllint 说的错误是什么?
  • @Phylogenesis:更新问题,输出为xmllint
  • @halfbit:谢谢。似乎需要修改 sed 正则表达式以去除控制字符?
  • sed 作用于字符而不是字节。如果文件的编码错误,您将不知道 sed 会看到什么。您需要一个在二进制级别而不是字符级别工作的工具。

标签: regex xml utf-8 sed xmllint


【解决方案1】:

使用 sed 从 Unicode 表中删除特定代码点有点困难。

如果您需要针对特定​​的 Unicode 类别的字符,使用 Perl 会更有意义。

perl -pe -i 's/(?![\t\n\r])\p{Cc}//g' file

将删除除 TAB、CR 和 LF 之外的所有控制字符。

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 2020-06-01
    • 2018-04-30
    • 2011-04-04
    • 2018-01-23
    • 2018-01-05
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多