我正在尝试使用 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
在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"/>
答案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 标签包含在修改后的文本中。