0

次の状況を処理するためのコマンドのヘルプが必要です。ネットでヘルプを検索していますが、解決策を見つけることができません。

問題は次のとおりです。

「temp.xml」という名前のxmlファイルがあります。xmlファイルのテキストは、たとえば

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

変数 x (312) に Note_Nbr だけを保存したい

私は何かを試してみますが、うまくいきません。

 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)

...または、新しい十分な xmllint ではなく XMLStarlet がある場合:

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 に答える