【问题标题】:Why does Unix "strings" command remove XML comment close tags?为什么 Unix“字符串”命令会删除 XML 注释关闭标签?
【发布时间】:2014-09-14 00:35:30
【问题描述】:

我不是 Unix shell 脚本专家,但我最近遇到了一个脚本删除 XML 注释块的结束标记的问题,从而导致整个文件成为一个巨大的未闭合注释,在中间件系统中立即失败阅读它。我将问题缩小到脚本中的strings 命令。

例如,文件 temp.xml 包含以下 XML:

<?xml version="1.0" encoding="utf-8" ?>
<!--
This is a comment
-->
<object>Foo</object>

针对它运行以下命令:strings - temp.xml

输出是:

<?xml version="1.0" encoding="utf-8" ?>
<!--
This is a comment
<object>Foo</object>

请注意,仅当结束注释标记位于其自己的行上且不包含其他内容时,才会观察到此行为。所以This is a comment--&gt; 被单独留下。

这对我来说完全是荒谬的。有什么原因吗?

这发生在 Linux 2.6.18 上。发行版是 RHEL Server 5.10。

【问题讨论】:

    标签: linux shell unix


    【解决方案1】:

    因为strings 命令只打印长度为 4 个或更多字符的字符串。 --&gt; 的长度为 3,因此它会忽略它。您使用strings 处理文件的任何原因?

    手册页说:

    对于给定的每个文件,GNU 字符串打印至少 4 个字符长的可打印字符序列(或 用下面的选项给出的数字),后跟一个不可打印的字符。默认情况下,它只打印 来自目标文件的初始化和加载部分的字符串;对于其他类型的文件,它会打印来自 整个文件。

    字符串主要用于确定非文本文件的内容。

    【讨论】:

    • 代码是由不再在公司工作的人编写的,所以我不知道他们为什么选择使用strings。它似乎用于在以下语句中从文件中删除所有不可打印的字符:strings - $file|tr "\n" " " &gt; /tmp/$file
    • 如果是 xml,我不希望它有不可打印的字符。我必须承认,在这个案例中,我看不出他所做的事情的理由。几乎想知道他是否打算使用cat 而不是stringstr 部分很有意义,因为他用空格替换了所有 `\n'。虽然我想知道他为什么不用什么来代替它。
    • 可能。这些文件通常包含法语字符和其他会导致某些下游系统出现问题的字符,例如一些拉丁连字(例如 –)、en-和 em-dashes、花引号等。我认为这个想法是删除所有这些字符。
    • 我可能会使用tr 来删除不可打印的字符,用cat $file | tr -cd '\15\40-\176' 代替strings - $file
    • 谢谢,我会试一试的。并感谢您的回答。
    猜你喜欢
    • 2011-06-20
    • 2010-11-01
    • 2017-03-27
    • 2022-03-16
    • 1970-01-01
    • 2013-08-05
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多