bash 脚本写入 xml 文件的特定部分
bash script to write in specific part of xml file
我的问题是下面的这段代码将结果放在文件的开头,但我想把它放在特定的位置。
#!/bin/bash -x
USER_ID=( User1 User2 User3 )
USER_CONF=/opt/test/config.xml
for i in "${USER_ID[@]}"; do
printf '<user><id>ID</id><name><%s/name></user>\n' "$i" >> "$USER_CONF"
done
我现在在 config.xml 中得到的是:
<company="external">
<enabled>true</enabled>
<users="allowed">
USER_TO_INSERT_HERE
</users>
</company>
<user><id>ID</id><name><User1/name></user>
<user><id>ID</id><name><User2/name></user>
<user><id>ID</id><name><User3/name></user>
config.xml中的脚本执行后我想得到的是:
<company="external">
<enabled>true</enabled>
<users="allowed">
<user><id>ID</id><name><User1/name></user>
<user><id>ID</id><name><User2/name></user>
<user><id>ID</id><name><User3/name></user>
</users>
</company>
你知道我如何记录 for 的值并将它们写入变量然后在代码中仅 sed 那个 var 吗?
我知道如何 sed 但不知道如何在 var 中记录值或类似的东西?
unix.stackexchange.com 上有很多很棒的答案。
此类情况的规范答案(注意:一般情况下 XML 并非适用于所有情况,而是适用于行上有一个 TOKEN 的文件,它自己被替换 - 这正是你给出的案例)是 -
a) 输出文件的部分“直到”带有标记的行之前的行
b) 输出替换
c) 从带有标记
的行之后的行“输出”文件的其余部分
例如这是简单的 sed 变体(它没有 sed 的 r
选项那么优雅)-
sed -e '/USER_TO_INSERT_HERE/,$ d' source.xml
cat replacement.xml
sed -e '1,/USER_TO_INSERT_HERE/ d' source.xml
首先,<users="allowed">
在一个无效的 XML 节点中。这可能应该是 <users permission="allowed">
.
请使用像 xidel 这样的 XML 解析器来编辑您的 'config.xml'.
与“direct element constructors”:
$ xidel -s config.xml -e '
x:replace-nodes(
//users,
<users permission="allowed">{
for $user in ("User1","User2","User3") return
<user><id>ID</id><name>{$user}</name></user>
}</users>
)
' --output-node-format=xml --output-node-indent
$ xidel -s config.xml -e '
x:replace-nodes(
//users,
function($x){
element {$x/name()} {
$x/@*,
for $user in ("User1","User2","User3") return
element user {
element id {"ID"},
element name {$user}
}
}
}
)
' --output-node-format=xml --output-node-indent
输出:
<company="external">
<enabled>true</enabled>
<users permission="allowed">
<user>
<id>ID</id>
<name>User1</name>
</user>
<user>
<id>ID</id>
<name>User2</name>
</user>
<user>
<id>ID</id>
<name>User3</name>
</user>
</users>
</company="external">
我的问题是下面的这段代码将结果放在文件的开头,但我想把它放在特定的位置。
#!/bin/bash -x
USER_ID=( User1 User2 User3 )
USER_CONF=/opt/test/config.xml
for i in "${USER_ID[@]}"; do
printf '<user><id>ID</id><name><%s/name></user>\n' "$i" >> "$USER_CONF"
done
我现在在 config.xml 中得到的是:
<company="external">
<enabled>true</enabled>
<users="allowed">
USER_TO_INSERT_HERE
</users>
</company>
<user><id>ID</id><name><User1/name></user>
<user><id>ID</id><name><User2/name></user>
<user><id>ID</id><name><User3/name></user>
config.xml中的脚本执行后我想得到的是:
<company="external">
<enabled>true</enabled>
<users="allowed">
<user><id>ID</id><name><User1/name></user>
<user><id>ID</id><name><User2/name></user>
<user><id>ID</id><name><User3/name></user>
</users>
</company>
你知道我如何记录 for 的值并将它们写入变量然后在代码中仅 sed 那个 var 吗? 我知道如何 sed 但不知道如何在 var 中记录值或类似的东西?
unix.stackexchange.com 上有很多很棒的答案。
此类情况的规范答案(注意:一般情况下 XML 并非适用于所有情况,而是适用于行上有一个 TOKEN 的文件,它自己被替换 - 这正是你给出的案例)是 - a) 输出文件的部分“直到”带有标记的行之前的行 b) 输出替换 c) 从带有标记
的行之后的行“输出”文件的其余部分例如这是简单的 sed 变体(它没有 sed 的 r
选项那么优雅)-
sed -e '/USER_TO_INSERT_HERE/,$ d' source.xml
cat replacement.xml
sed -e '1,/USER_TO_INSERT_HERE/ d' source.xml
首先,<users="allowed">
在一个无效的 XML 节点中。这可能应该是 <users permission="allowed">
.
请使用像 xidel 这样的 XML 解析器来编辑您的 'config.xml'.
与“direct element constructors”:
$ xidel -s config.xml -e '
x:replace-nodes(
//users,
<users permission="allowed">{
for $user in ("User1","User2","User3") return
<user><id>ID</id><name>{$user}</name></user>
}</users>
)
' --output-node-format=xml --output-node-indent
$ xidel -s config.xml -e '
x:replace-nodes(
//users,
function($x){
element {$x/name()} {
$x/@*,
for $user in ("User1","User2","User3") return
element user {
element id {"ID"},
element name {$user}
}
}
}
)
' --output-node-format=xml --output-node-indent
输出:
<company="external">
<enabled>true</enabled>
<users permission="allowed">
<user>
<id>ID</id>
<name>User1</name>
</user>
<user>
<id>ID</id>
<name>User2</name>
</user>
<user>
<id>ID</id>
<name>User3</name>
</user>
</users>
</company="external">