SEDまたはAWKを使用してxmlファイルから2つの異なるパターンに一致する2行のコピー

SEDまたはAWKを使用してxmlファイルから2つの異なるパターンに一致する2行のコピー

次の種類の行を含む大きなxmlファイルがあります。

<test type="one" valid="yes" description="something">
                    twilight-.*\.iso\.auth</test>

<test type="one" valid="no" description="something else">
                    testlite-.*\.cop</test>

<test type="two" valid="yes" description="something else">
                    messing-.*\.cop\.auth</test>
<test type="three" valid="yes" description="something else">messing-.*\.cop\.auth</test>

私のXMLファイルにはこのような行がたくさんあります。私の要件は次のとおりです

  1. 最初の行の "valid="yes"" パターンと 2 行目の ".auth" パターンが一致すると、これら 2 行がコピーされます。 2行目の「.auth」を「.newauth」に置き換えます。
  2. 同じ行で "valid="yes" と ".auth" パターンが一致する場合は、その行をコピーして ".auth" を ".newauth" に置き換えます。

出力は次のようになります。

<test type="one" valid="yes" description="something">
                    twilight-.*\.iso\.auth</test>
<test type="one" valid="yes" description="something">
                    twilight-.*\.iso\.newauth</test>

<test type="one" valid="no" description="something else">
                    testlite-.*\.cop</test>

<test type="two" valid="yes" description="something else">
                    messing-.*\.cop\.auth</test>
<test type="two" valid="yes" description="something else">
                    messing-.*\.cop\.newauth</test>
<test type="three" valid="yes" description="something else">messing-.*\.cop\.auth</test>
<test type="three" valid="yes" description="something else">messing-.*\.cop\.newauth</test>

私のxmlファイルには、置き換える必要がある複数行(ペア)があることに注意してください。ただし、交換規則は上記と同じです。また、4行目の場合は、xmlタグ全体が1行の一部であることに注意してください。したがって、この場合、awk式はやや複雑になります。

よろしくお願いします!

ベストアンサー1

修正された質問に合わせて更新されました

この試み。 GNU awk 4.2.1ではうまく動作するようです。

awk '/valid="yes"/{print;if(!/<\/test>/){a=$0;getline;print $0"\n"a}gsub(/\.auth/,".newauth")}1' filename

おすすめ記事