如何通过命令行在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

您不应该使用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”中在新行中附加一个模式。

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

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 标签包含在修改后的文本中。

相关内容