正则表达式shell脚本将文件的特定部分保存到变量

时间:2012-07-07 15:32:44

标签: regex shell expression

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

问题是:

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

感谢您的帮助。

1 个答案:

答案 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