如何更新配置文件中的值

如何更新配置文件中的值

我有一个Config.yml文件,我想使用 shell 脚本更新如下所示的值。

当前文件数据

servers: 
- uri: http://localhost:5550/service/mgmt/current
- displayName: server1
- username: user
- password: welcome
- domains:
--- default
--- domain1
- useBulkApi: true 

所需的输出应如下所示:

servers: 
- uri: https://hostname1:5550/service/mgmt/current
- displayName: instance1
- username: xx
- password: xx
- domains:
--- default
--- domain1
- useBulkApi: true

每个 URI 的主机名、用户、密码和域名都会发生变化。这些值来自脚本。我必须更新至少 3 个服务器详细信息,每个服务器都有不同的 URI、主机名、用户、密码和域。

答案1

您可以使用以下代码更改所需的配置文件。 PS:在您想要修改任何内容的地方,
请提及正确的路径并包含更多替换字符串。 注意:将永久替换琴弦。修改前请先验证一次。config.yml
sed -i

find  Config.yml -type f -exec sed -i 's/user/<NewUser>/g; s/welcome/<newPassword>/g' {} \;

答案2

我假设您的 YAML 文档如下所示:

servers:
  - uri: http://localhost:5550/service/mgmt/current
    displayName: server1
    username: user
    password: welcome
    domains:
      - default: domain1
    useBulkApi: true

...因为你所展示的没有多大意义。

任务,我要定义它的方式(因为问题中对此进行了非常模糊的解释)是替换键displayNameusername和的值,其值为(或任何特定值)password的元素。我忽略了这样一个事实:问题中的 URL 似乎获得了,使其成为 HTTPS URL 而不是 HTTP URL,并且我对密码进行了 Base64 编码,只是为了展示如何完成此操作。urihttp://localhost:5550/service/mgmt/currents

为此,我们将使用yqfromhttps://kislyuk.github.io/yq/在期望读取由制表符分隔字段 URL、显示名称、用户名和密码组成的行的脚本中。该脚本使用 URL 来查找并更新serversYAML 文档中数组中的正确条目。该文件Config.yml已就地编辑。

#!/bin/sh

pathname=Config.yml

tab=$(printf '\t')

while IFS=$tab read -r uri name user password
do
        yq -y --in-place \
                --arg uri "$uri" \
                --arg name "$name" \
                --arg user "$user" \
                --arg password "$password" '
                ( .servers[] | select(.uri == $uri) ) |=
                (
                        .displayName = $name |
                        .username = $user |
                        .password = ($password|@base64)
                )' "$pathname"
done

测试运行:

$ cat Config.yml
servers:
  - uri: http://localhost:5550/service/mgmt/current
    displayName: server1
    username: user
    password: welcome
    domains:
      - default: domain1
    useBulkApi: true
$ cat input
http://localhost:5550/service/mgmt/current      instance1       Theodore Y.     my*special password
$ sh script <input
$ cat Config.yml
servers:
  - uri: http://localhost:5550/service/mgmt/current
    displayName: instance1
    username: Theodore Y.
    password: bXkqc3BlY2lhbCBwYXNzd29yZA==
    domains:
      - default: domain1
    useBulkApi: true

相关内容