ファイルがありますが、Config.yml
シェルスクリプトを使用して以下のように値を更新したいと思います。
現在のファイルデータ
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のホスト名、ユーザー、パスワード、ドメイン名が変更されます。この値はスクリプトから得られます。それぞれ異なるURI、ホスト名、ユーザー、パスワード、およびドメインを使用して、少なくとも3つのサーバーの詳細を更新する必要があります。
答え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がHTTP URLではなくHTTPS URLになるように取得したように見えることを無視し、これがどのように実行されるかを示すためにBase64でパスワードをエンコードしました。uri
http://localhost:5550/service/mgmt/current
s
そのためには、yq
以下を使用します。https://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