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">.

请使用像 这样的 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

与“computed constructors”:

$ 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">

Playground