通过shell脚本获取XML标记值

通过shell脚本获取XML标记值,xml,shell,unix,sed,awk,Xml,Shell,Unix,Sed,Awk,我需要从示例XML标记中获取用户名和密码值 <CommCellUser userName="~!@#$%^&*()_+`1=- 23)()();';" password="":>?<,./;'|}{[] ><:"/" </CommCellUser> 像这样吸引人的人错过了很多案子。因为它的值中可能包含空格和特殊字符 请提供帮助。以下解决方案对传递给userName和password属性的字符串进行编码,以便认为XML字符串有效 #!/bin/

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

<CommCellUser userName="~!@#$%^&*()_+`1=- 23)()();';" password="":>?<,./;'|}{[]  ><:"/" </CommCellUser>
像这样吸引人的人错过了很多案子。因为它的值中可能包含空格和特殊字符


请提供帮助。

以下解决方案对传递给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
#/bin/bash
XML=“”
USER=`echo$XML | xmllint--xpath“字符串(/CommCellUser/@userName)”-`
PASS=`echo$XML | xmllint--xpath“字符串(/CommCellUser/@password)”-`
echo用户名=$USER
回显密码=$PASS
生成以下输出:

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

password=“:>?我希望您的示例中的密码值是一个输入错误。否则您的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:>?<,./;'|}{[]  ><:
kent$echo$comm\u cell\u线路

示例xml标记:?编辑帖子以正确格式化脚本,并提供一些示例输入和该输入的预期输出。请声明“值将以双引号括起”。该值可能包含edouble quotes“:文本如何由字符分隔并包含该字符?除非文本中对该字符应用了某种转义规则,例如
“foo\”bar“
“foo”“bar”
或。。。。所以你需要告诉我们这个转义规则是什么,并给出一个例子。因为我是从一个文件中读取的,所以用户名和密码可以设置为任何值。在我的上一篇文章中,通过使用您的方法,我们为它设置了值,它可以包含所有字符。密码的规则是tag UserName=“(可以包含此引号中的任何内容)”。如果带引号分隔的字符串可以包含引号,则没有解决方案,因为无法确定字符串的结束位置。
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:>?<,./;'|}{[]  ><: