編集する:

編集する:

このスクリプトを実行しています。

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閉じるタグを処理するときは、文字列内のすべてのタグに追加の\レベルのエスケープが必要であることに注意してください。)

関連情報