正确的方法是使用真正的 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
现在,如果您只想使用文字字符串,您可以使用参数扩展构建一些看起来像这样的脆弱的东西:
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