我需要一些命令的帮助来处理以下情况。 我在网上寻求帮助,但我无法找到解决方案。
问题是:
我有一个名为“temp.xml”的xml文件 xml文件中的文本例如是
<?xml version="1.0" encoding="utf-8"?>
<NoteData Note_Nbr="312" Data_Revision="2" Note_Revision="1" />
我只想将Note_Nbr保存到我的变量x(312)
我尝试了一些东西,但它不起作用。
X=$(sed -r 's/[^|]*(Note_Nbr=")(\d\d\d)([^|]*)/2 /' temp.xml )
感谢您的帮助。
答案 0 :(得分:1)
执行此操作的正确方法是使用真正的XML解析器:
x=$(xmllint --xpath 'string(/NoteData/@Note_Nbr)' test.xml)
...或者,如果您有XMLStarlet而不是足够新的xmllint:
x=$(xmlstarlet sel -t -m '/NoteData' -v @Note_Nbr -n <test.xml)
另见答案:https://stackoverflow.com/a/1732454/14122
现在,如果你只想使用文字字符串,你可以使用parameter expansion构建一个看起来很脆弱的东西:
s='<NoteData Note_Nbr="312" Data_Revision="2" Note_Revision="1" />'
s=${s#* Note_Nbr=\"}; s=${s%%\"*}; echo "$s"
或者,您可以在bash中使用本机正则表达式支持(请注意,此功能是POSIX sh中不存在的bash扩展名):
s='<NoteData Note_Nbr="312" Data_Revision="2" Note_Revision="1" />'
re='Note_Nbr="([^"]+)"'
if [[ $s =~ $re ]]; then
match="${BASH_REMATCH[1]}"
else
echo "ERROR: No match found" >&2
fi