正規表現を使用して子タグのパターンを見つけ、全体の親タグを置き換える方法はありますか?私はグラフィック環境のない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
私が好む方法は、しばしばxmlstarlet
XMLデータを使って作業することです。編集する必要があるサブツリーを参照する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/>
サブツリーを削除して新しいサブツリーを追加することもできますが、これは順次処理を中断する可能性があるため、ここではそうしませんでした。