如何通过命令行在 XML 文件的标签中添加属性?

kri*_*hna 4 command-line xml sed text-processing files

我正在尝试使用 sed 脚本在标签末尾添加字段。假设我在 XML 文件中有一个标签:

<book name="Sed tutorial" price="250"/>
Run Code Online (Sandbox Code Playgroud)

现在我想Book_Width="A"<book/>标签结束后添加字段,以便我的标签变为:

<book name="Sed tutorial" price="250" Book_Width="A"/>
Run Code Online (Sandbox Code Playgroud)

我试过sed

sed '/<book "[^>]*>/ a Book_Width="A"'
Run Code Online (Sandbox Code Playgroud)

但它给出了:

<book name="Sed tutorial" price="250"/>
Book_Width="A"
Run Code Online (Sandbox Code Playgroud)

cha*_*aos 15

你不应该用 解析 xml sedxmlstarlet而是使用一个 xml 解析器。对于您的任务,它将是:

xmlstarlet ed -O --inplace --insert "/book" --type attr -n Book_Width -v A xml_file
Run Code Online (Sandbox Code Playgroud)

然后文件内容是:

<book name="Sed tutorial" price="250" Book_Width="A"/>
Run Code Online (Sandbox Code Playgroud)
  • ed编辑 xml 树的手段编辑模式
  • -O 省略 xml 标签
  • 我们想插入一些东西 --insert
  • "/book" 是插入的路径
  • --type attr: 这是一个属性,我们要插入
  • -n属性名称
  • 价值 -v


Fel*_*xJN 5

sed“a”中在新行中附加一个模式。

你想要做的是替换(s替代)。为了清楚起见,让我们使用冒号作为分隔符:

sed 's:\(<book.*\)\(/>\):\1 Book_Width="A"\2:'
Run Code Online (Sandbox Code Playgroud)

中的任何内容\( .. \)都是按出现顺序记忆并由 调用的模式\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"/>
Run Code Online (Sandbox Code Playgroud)