構成ファイルの値を更新する方法

構成ファイルの値を更新する方法

ファイルがありますが、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でパスワードをエンコードしました。urihttp://localhost:5550/service/mgmt/currents

そのためには、yq以下を使用します。https://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

関連情報