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