以下语法用于捕获文件中的单词<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 处理器在解析之前必须像对输入中的外部解析实体(包括文档实体)中的所有换行符进行规范化一样,将双字符序列
#xD #xA
以及#xD
后面没有的任何字符序列都转换#xA
为单个#xA
字符。
这里#xD
表示CR,#xA
表示LF。
在你的情况下,整个find … | xargs
语句就是你的 XML 处理器(让我们把这样的问题这除了)。如果你想完全遵守规范,你应该首先检查每个.xml
文件。dos2unix
但由于真正的问题在于变量的内容,所以对于您来说这可能就足够了:
var=`find … | dos2unix | xargs`
如果您没有dos2unix
,tr -d '\r'
可以在此上下文中作为替代品(感谢@GordonDavisson 指出这一点)。