我需要从示例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`
这样的提取错过了很多案例。因为它可能包含空格和值中的特殊字符。
请帮忙。
答案 0 :(得分:0)
以下解决方案对传递给 userName 和 password 属性的字符串进行编码,以便将XML字符串视为有效。
#!/bin/bash
XML="<CommCellUser userName='~!@#$%^&*()_+``1=- 23)()();';' password='":>?<,./;'|}{[] ><:"/'></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:>?<,./;'|}{[] ><: