タグの末尾にフィールドを追加するために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
sed
XMLを解析するには、次の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"/>
ed
XMLツリーを編集する編集モードを示します。-O
XMLタグを省略します。- 私たちは何かを挿入したいと思います
--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
属性を追加できます)。xq
yq
https://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タグを含めるには、交換モードでそれを使用します。