2012-07-07 47 views
0

我需要某些命令的幫助來處理以下情況。 我在網上尋求幫助,但我無法找到解決方案。正則表達式shell腳本將文件的特定部分保存到變量中

問題是:

我命名爲「temp.xml」 在XML文件中的文本例如

<?xml version="1.0" encoding="utf-8"?> 
<NoteData Note_Nbr="312" Data_Revision="2" Note_Revision="1" /> 

我想只保存Note_Nbr我的變量x一個xml文件(312)

我嘗試了一些,但它不起作用。

X=$(sed -r 's/[^|]*(Note_Nbr=")(\d\d\d)([^|]*)/2 /' temp.xml) 

謝謝你的幫助。

回答

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中的原生支持正則表達式(請注意,此功能是一個bash擴展沒有出現在POSIX SH):

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 
+0

謝謝您的答覆。 當我嘗試這個命令時,它給了我一個錯誤 未知的選項--xpath – 2012-07-07 15:38:05

+0

你的幫助解決的問題非常感謝你 – 2012-07-07 15:49:16

+0

@UmutDönmez不幸的是,舊版本的xmllint沒有'--xpath';這就是爲什麼我也提供了xmlstarlet版本。我很高興這有幫助。 – 2012-07-07 16:37:01

相關問題