このスクリプトを実行しています。
INPUTNAME=ABC.XYZ
FILENAME="Sample.xml"
awk -v inputName=$INPUTNAME '
/<machine.*name=/ { f=1 ; m=0 ; res="" }
f { res = res $0 ORS }
f && /<details input="inputName"/ { m=1 }
/<\/machine>/ { f=0 ; if (m) print res $0 }
' $FILENAME
次のように出力されます。
<machine name="sample1" min="1" max="10" idleTime="300" backend="ABC,XYZ">
<handler className="com.abc.xyz.qwerty.foo.FooBar" />
<details input="ABC.XYZ" suggExpiry="30" minExpiry="4" maxExpiry="500"/>
</machine>
しかし、パラメータの入力に失敗しました。スクリプトにどのような問題があると思いますか?
メモ:
ハードコードされた値(パラメータなし)で実行しましたが、スムーズに実行されました。
答え1
awkが変数をその値に置き換えるかどうかはわかりません。
f && /<details input="inputName"/
次に、交換したい場合があります。
f && /<details input="/ && index($2,inputName) > 0
編集する:
最終awk部分は次のようになります。
/<machine.*name=/ { f=1 ; m=0 ; res="" }
f { res = res $0 ORS }
f && /<details input="/ && index($2,inputName) > 0 { m=1 ;}
/<\/machine>/ { f=0 ; if (m) print res ; } ## last line already in res
答え2
inputName
変数なので可能です。いいえRepexp定数を使用します/.../
(と同様f && /<details input="inputName"/
)。代わりに、文字列を介して動的正規表現を使用してください。
f && $0 ~ "<details input=" inputName
文字列を変数に"..."
関連付ける場所inputName
。
(注:XMLを処理しているため、XML閉じるタグを処理するときは、文字列内のすべてのタグに追加の\
レベルのエスケープが必要であることに注意してください。)