web-dev-qa-db-ja.com

コマンドラインでXMLファイルのタグに属性を追加するにはどうすればよいですか?

Sedスクリプトを使用してタグの最後にフィールドを追加しようとしています。 XMLファイルにタグがあるとします。

<book name="Sed tutorial" price="250"/>

次に、Book_Width="A"タグの終了後に<book/>としてフィールドを追加して、タグが次のようになるようにします。

<book name="Sed tutorial" price="250" Book_Width="A"/>

sedで試しました:

sed '/<book "[^>]*>/ a Book_Width="A"'

しかしそれは与える:

<book name="Sed tutorial" price="250"/>
Book_Width="A"
2
krishna

Xmlをsedで解析するのではなく、代わりにxmlstarletのようなxmlパーサーを使用してください。あなたの仕事のためにそれは次のようになります:

xmlstarlet ed -O --inplace --insert "/book" --type attr -n Book_Width -v A xml_file

その場合、ファイルの内容は次のようになります。

<book name="Sed tutorial" price="250" Book_Width="A"/>
  • edは、xmlツリーを編集するための編集モードを意味します
  • -Oはxmlタグを省略します
  • --insertで何かを挿入したい
  • "/book"は挿入するパスです
  • --type attr:これは属性です。挿入します
  • 属性の名前-n
  • -v
13
chaos

in sed "a"は、新しい行にパターンを追加します。

あなたがしたいのは(substitute)を置き換えることです。わかりやすくするために、区切り文字としてコロンを使用しましょう。

_sed 's:\(<book.*\)\(/>\):\1 Book_Width="A"\2:'
_

\( .. \)内のすべてのものは、出現順序によって記憶され、_\indexnumber_によって呼び出されるパターンです。 _\1_は、保存された最初のパターンを再現します。

したがって、_<book name="Sed tutorial" price="250"_をパターン1として、_/>_をパターン2として記憶し、中央に_Book_Width="A"_を挿入するだけです。

_echo '<book name="Sed tutorial" price="250"/>' | sed 's:\(<book.*\)\(/>\):\1 Book_Width="A"\2:'
<book name="Sed tutorial" price="250" Book_Width="A"/>
_
3
Fiximan

awkを使用すると、次のようなことができます。

その行がファイルfile1.xmlにあるとすると、次のようになります。

awk -F '/' '{print $1,"Book_Width=\"A\"",FS,$2}' file1.xml
1
jcbermu