Linuxのsedコマンドを使って複数行の値があるXMLタグを抽出する方法をご紹介します。
XMLから特定のタグを抜き出すというのはよくある処理で、grep、awkなどいくつかの方法がありますが、今回はsedを使った方法です。
インプットファイル例1
input_file_name.xmlという名前のファイルがあったとします。
<sample>
サンプル行1
サンプル行2
サンプル行3
</sample>
通常のsedでは行ごとの処理になるためそのままでは抜き出すことはできません。
そこでこのようなコマンドを使います。
sed -n /<sample>/,/<\/sample>/p input_file_name.xml
このコマンドをしようすると、この二つの条件の間に複数行があっても抜き出すことができます。
インプットファイル例2
それではもし内側に同じ名前のタグがあった場合ではどうでしょうか。
input_file_name2.xml
<sample>
サンプル行1
<sample>
サンプル行2
</sample>
サンプル行3
</sample>
この場合では上のコマンドでは一つ目の</sample>までしか抜き出されません。これを一番最初の最後の<sample>から</sample>まで抜き出したい場合、つまりもっとも長いマッチを行いたい場合には、インデントが行われている前提ですが、
sed -n /^<sample>/,/^<\/sample>/p input_file_name2.xml
というようにそのタグが行頭にあることを示せば二つ目の</sample>まで抜き出すことができます。
もしさらに外側にタグがありインデントが違う場合は、必要に応じてスペースを^の後に付け足してください。
一行や複数行に関わらず必要なタグを抜き出すことができるので、XMLの処理では大変便利なコマンドです。
sedコマンドの解説
-n (または–quiet、 –silent) デフォルトのプリントを停止、処理した部分だけプリントする
/START/,/END/ STARTのマッチする行からENDのマッチする行まで処理する(複数行可)
p プリントする