sed ツールを使用せずに (サブタグの) パターンを探し、XML ファイル内の完全な親タグを置き換えます。

sed ツールを使用せずに (サブタグの) パターンを探し、XML ファイル内の完全な親タグを置き換えます。

正規表現を使用して子タグのパターンを見つけ、全体の親タグを置き換える方法はありますか?私はグラフィック環境のないLinuxサーバーで作業しています。

次のXMLがあります。

<?xml version="1.0" encoding="UTF-8"?>  
<bookstore>  
  <book category="COOKING">  
    <title lang="en">Everyday Italian</title>  
    <author>Giada De Laurentiis</author>  
    <year>2005</year>  
    <price>30.00</price>  
  </book>  
  <book category="CHILDREN">  
    <title lang="en">Harry Potter</title>  
    <author>J K. Rowling</author>  
    <year>2005</year>  
    <price>29.99</price>  
  </book>  
  <book category="WEB">  
    <title lang="en">Learning XML</title>  
    <author>Erik T. Ray</author>  
    <year>2003</year>  
    <price>39.95</price>  
  </book>  
</bookstore>  

パターンを見つけるためのシェルスクリプトが必要です。

<author>J K. Rowling</author>

その後、ブロック全体を交換します。

  <book category="CHILDREN">  
    <title lang="en">Harry Potter</title>  
    <author>J K. Rowling</author>  
    <year>2005</year>  
    <price>29.99</price>  
  </book>  

そして:

  <book category="CHILDREN">  
    <title lang="en">Hamlet</title>  
    <author>William Shakespeare</author>  
  </book>

ついに得た:

<?xml version="1.0" encoding="UTF-8"?>  
<bookstore>  
  <book category="COOKING">  
    <title lang="en">Everyday Italian</title>  
    <author>Giada De Laurentiis</author>  
    <year>2005</year>  
    <price>30.00</price>  
  </book>  
  <book category="CHILDREN">  
    <title lang="en">Hamlet</title>  
    <author>William Shakespeare</author>  
  </book>  
  <book category="WEB">  
    <title lang="en">Learning XML</title>  
    <author>Erik T. Ray</author>  
    <year>2003</year>  
    <price>39.95</price>  
  </book>  
</bookstore> 

同様に、 との間のすべてのテキストまたはコードのワイルドカード<book*<author>J K. Rowling</author>*</book>はどこにありますか?*<book<author>...

Perlを使用して次の論理ステップを考慮するアイデアがあります。

  1. 検索パターンが配置されている行番号
  2. 親ブロックのオープンタグとクローズタグの行番号を識別します。
  3. この行内のすべての内容を削除します。
  4. この行に新しいブロックを追加してください。

しかし可能です。私は最初のアプローチを好みます。

ベストアンサー1

私が好む方法は、しばしばxmlstarletXMLデータを使って作業することです。編集する必要があるサブツリーを参照するxmlstarlet変数を宣言します。$book

xmlstarlet <682660.xml ed                                               \
    --var book '//book[author="J K. Rowling"]'                          \
    --update '$book' --value ''                                         \
    --update '$book/@category' --value 'CHILDREN'                       \
    --subnode '$book' --type 'elem' --name 'title'  --value 'Hamlet'    \
    --subnode '$book/title' --type attr --name 'lang' --value 'en'      \
    --subnode '$book' --type 'elem' --name 'author' --value 'William Shakespeare'

出力

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <book category="COOKING">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book category="CHILDREN">
    <title lang="en">Hamlet</title>
    <author>William Shakespeare</author>
  </book>
  <book category="WEB">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

関連する<book/>サブツリーを削除して新しいサブツリーを追加することもできますが、これは順次処理を中断する可能性があるため、ここではそうしませんでした。

おすすめ記事