-1

我的问题是下面的代码将结果放在文件的开头,但我想把它放在一个特定的位置。

#!/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 中记录值或类似的东西?

4

2 回答 2

2

首先,<users="allowed">在一个无效的 XML 节点中。这应该是类似的东西<users permission="allowed">

请使用像这样的 XML 解析器来编辑您的 'config.xml'

使用“直接元素构造函数”:

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

操场

于 2021-03-14T15:44:54.790 回答
1

unix.stackexchange.com上有很多很棒的答案。

这种情况的规范答案(注意:不是在所有情况下一般都适用于 XML,而是对于在一行上有一个 TOKEN 的文件要替换 - 这正是你给出的情况)是 - 一个)输出文件的“直到”带有标记的行之前的行 b)输出替换 c)输出文件的其余部分“从”带有标记的行之后的行

例如,这是简单的 sed 变体(它远没有rsed 选项那么优雅) -

sed -e '/USER_TO_INSERT_HERE/,$ d' source.xml
cat replacement.xml
sed -e '1,/USER_TO_INSERT_HERE/ d' source.xml
于 2021-03-10T09:32:46.617 回答