行に一致する特定のセクションのタグ値をsedで置き換える

行に一致する特定のセクションのタグ値をsedで置き換える

sed コマンド (または awk) を使用して、ファイルのセクションの下で別の行が一致する場合に行を変更したいと思います。ファイルの例を次に示します。

MyFic.txt の抜粋:

  <PlayList>
     ... Some tags ...
     <Album>X1</Album>
     ... oThers tags ...
     <Group>X2</Group>
     ... Some tags ...
   </PlayList>
   <PlayList>
      ... Some tags ...
      <Album>...</Album>
      ... oThers tags ...
      <Group>...</Group>
      ... Some tags ...
    </PlayList>

タグ Album の値が X1 の場合に、タグ Group の値を PlayList セクションのみに X3 で変更したいと思います。次のコマンドは正常に機能します。

sed -i '/< Album>X1/,/<\/PlayList>/ s/< Group>.*/< Group>X3<\/location>/' MyFic.txt

しかし、これは私が本当に望んでいるものではありません。次のようなものが欲しいです:

sed -i '/< PlayList>/,/<\/PlayList>/ {Containing  < Album>X1} s/< Group>.*/< Group>X3<\/location>/' MyFic.txt

この部分を sed コマンドでどのようにコーディングすればよいかわかりません。{Containing < Album>X1}

何かアイディアはありますか?

答え1

XMLを処理するには、適切なXML処理ツールを使用します。たとえば、xsh:

cd //PlayList[Album='X1']/Group
set . 'X3'

関連情報