次の種類の行を含む大きな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ファイルにはこのような行がたくさんあります。私の要件は次のとおりです
- 最初の行の "valid="yes"" パターンと 2 行目の ".auth" パターンが一致すると、これら 2 行がコピーされます。 2行目の「.auth」を「.newauth」に置き換えます。
- 同じ行で "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