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"
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
in sed
"a"は、新しい行にパターンを追加します。
あなたがしたいのは(s
ubstitute)を置き換えることです。わかりやすくするために、区切り文字としてコロンを使用しましょう。
_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"/>
_
awk
を使用すると、次のようなことができます。
その行がファイルfile1.xmlにあるとすると、次のようになります。
awk -F '/' '{print $1,"Book_Width=\"A\"",FS,$2}' file1.xml