通过shell脚本获取XML标记值

时间:2012-11-22 17:45:22

标签: xml shell unix sed awk

我需要从示例XML标记中获取用户名和密码值

<CommCellUser userName="~!@#$%^&*()_+`1=- 23)()();';" password="":>?<,./;'|}{[]  ><:"/" </CommCellUser>

该值将以双引号显示。该值可能包含双引号和任何其他特殊字符,包括空格。

comm_cell_line=`grep "CommCellUser" /filename | head -1`
userName=`echo "$comm_cell_line" | awk '{print $2}' | cut -d"\"" -f2`
passwd=`echo "$comm_cell_line" | awk '{print $3}' | cut -d"\"" -f2`

这样的提取错过了很多案例。因为它可能包含空格和值中的特殊字符。

请帮忙。

2 个答案:

答案 0 :(得分:0)

以下解决方案对传递给 userName password 属性的字符串进行编码,以便将XML字符串视为有效。

#!/bin/bash

XML="<CommCellUser userName='~!@#$%^&amp;*()_+``1=- 23)()();&#39;;' password='&quot;:&gt;?&lt;,./;&#39;|}{[]  &gt;&lt;:&quot;/'></CommCellUser>"

USER=`echo $XML | xmllint --xpath "string(/CommCellUser/@userName)" -`
PASS=`echo $XML | xmllint --xpath "string(/CommCellUser/@password)" -`

echo username=$USER
echo password=$PASS

产生以下输出:

username=~!@#$%^&*()_+1=- 23)()();';
password=":>?<,./;'|}{[] ><:"/

由于您正在解析数据,因此可以假设传入数据有效。 xmllint命令可用于强制执行此检查。

注意:

答案 1 :(得分:0)

我希望您示例中的密码值是拼写错误。否则你的xml可能有问题。所以我从密码值中删除了双引号。看看下面的测试,grep是你的朋友从文本中获取东西:

kent$  echo $comm_cell_line                                           
<CommCellUser userName="~!@#$%^&*()_+`1=- 23)()();';" password="quote removed:>?<,./;'|}{[]  ><:"/" </CommCellUser>

kent$  userName=$(grep -Po '(?<=userName=")[^"]*' <<<$comm_cell_line )

kent$  pwd=$(grep -Po '(?<=password=")[^"]*' <<<$comm_cell_line )     

kent$  echo $userName                                                 
~!@#$%^&*()_+`1=- 23)()();';

kent$  echo $pwd     
quote removed:>?<,./;'|}{[]  ><: