0

我需要一些命令的帮助来处理以下情况。我在网上搜索寻求帮助,但我无法成功找到解决方案。

问题是:

我有一个名为“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 )

谢谢你的帮助。

4

1 回答 1

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

现在,如果您只想使用文字字符串,您可以使用参数扩展构建一些看起来像这样的脆弱的东西:

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
于 2012-07-07T15:36:03.260 回答