变量打印了预期值但实际值却不同

变量打印了预期值但实际值却不同

以下语法用于捕获文件中的单词<Name>.xml我还用它xargs来删除所有空格。

$> var=` find /tmp -name '*.xml' -exec sed -n 's/<Name>\([^<]*\)<\/Name>/\1/p' {} +  |  xargs `
$> echo $var
TOPIC
$>

到目前为止,一切似乎都还好。但还printf显示了其他内容:

$> printf "%q\n" "$var"
$'TOPIC\r'
$>

让我们深入研究一下:

$> [[ TOPIC == $var ]] && echo they are equal
$>

从来没有印刷过“它们是相等的”。

但是当我们回应时$var我们得到:

$> echo $var
TOPIC
$>

最大的问题是:如何从变量中删除多余的字符( $, )?\r

$'TOPIC\r'

答案1

$不在变量中,也不在文字中\r。它们被添加到输出中,因为你告诉了printf这样格式化:%q。真正的额外字符是“回车符”,代码0x0D,它转义序列\r

问题的根源在于你的.xml文件似乎使用了 DOS/Windows 世界中的 CR+LF 行尾。请参阅维基百科上的这个比较。

文件可扩展标记语言 (XML) 1.0(第五版)说:

为了简化应用程序的任务,XML 处理器在解析之前必须像对输入中的外部解析实体(包括文档实体)中的所有换行符进行规范化一样,将双字符序列#xD #xA以及#xD后面没有的任何字符序列都转换#xA为单个#xA字符。

这里#xD表示CR,#xA表示LF。

在你的情况下,整个find … | xargs语句就是你的 XML 处理器(让我们把这样的问题除了)。如果你想完全遵守规范,你应该首先检查每个.xml文件。dos2unix

但由于真正的问题在于变量的内容,所以对于您来说这可能就足够了:

var=`find … | dos2unix | xargs`

如果您没有dos2unixtr -d '\r'可以在此上下文中作为替代品(感谢@GordonDavisson 指出这一点)。

相关内容