コマンドラインを介してXMLファイルのタグに属性を追加するには?

コマンドラインを介して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"

答え1

sedXMLを解析するには、次のXMLパーサーを使用しないでくださいxmlstarlet。あなたの仕事については次のとおりです。

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

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

<book name="Sed tutorial" price="250" Book_Width="A"/>
  • edXMLツリーを編集する編集モードを示します。
  • -OXMLタグを省略します。
  • 私たちは何かを挿入したいと思います--insert
  • "/book"挿入されたパスです。
  • --type attr:これは私たちが挿入したい属性です。
  • -n属性の名前です。
  • -v

答え2

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

あなたがしなければならないことは、交換(s置換)することだけです。明確にするために、コロンを区切り文字として使用します。

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

質問に示されているように、XMLファイルが実際にノードを含む行であると仮定すると(book一部を使用してBook_Widthそのノードにbook属性を追加できます)。xqyqhttps://kislyuk.github.io/yq/)このように:

$ xq -x '.book."@Book_Width" |= "A"' file.xml
<book name="Sed tutorial" price="250" Book_Width="A"></book>

データを属性値として挿入する場合:

$ myvariable='20 cm'
$ xq -x --arg val "$myvariable" '.book."@Book_Width" |= $val' file.xml
<book name="Sed tutorial" price="250" Book_Width="20 cm"></book>

答え4

解決策は、sed外部パッケージやコマンドを使用または使用しないことです。

echo '<book name="Sed tutorial" price="250"/>' |
sed 's/<book /& Book_Width="A"/'

出力:

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

ファイルがある場合。

sed 's/<book /& Book_Width="A"/' ${FILE_NAME}

またはその場で交換したい場合

sed -i 's/<book /& Book_Width="A"/' ${FILE_NAME}

&:この記号は、一致する文字列全体を表すsedの特殊文字、つまり<book(space)です。変更されたテキスト内に元の<bookタグを含めるには、交換モードでそれを使用します。

関連情報