我有一个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
...因为你所展示的没有多大意义。
任务,我要定义它的方式(因为问题中对此进行了非常模糊的解释)是替换键displayName
、username
和的值,其值为(或任何特定值)password
的元素。我忽略了这样一个事实:问题中的 URL 似乎获得了,使其成为 HTTPS URL 而不是 HTTP URL,并且我对密码进行了 Base64 编码,只是为了展示如何完成此操作。uri
http://localhost:5550/service/mgmt/current
s
为此,我们将使用yq
fromhttps://kislyuk.github.io/yq/在期望读取由制表符分隔字段 URL、显示名称、用户名和密码组成的行的脚本中。该脚本使用 URL 来查找并更新servers
YAML 文档中数组中的正确条目。该文件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