구성 파일의 값을 업데이트하는 방법

구성 파일의 값을 업데이트하는 방법

파일 이 있는데 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

다음 코드를 사용하여 필수 구성 파일을 변경할 수 있습니다. 추신: 수정하려는 부분이 있으면
올바른 경로를 언급하고 더 많은 대체 문자열을 포함하십시오. 참고: 문자열은 영구적으로 교체됩니다. 수정하기 전에 꼭 확인해 주세요.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

...당신이 보여주는 내용이 별로 의미가 없기 때문입니다.

작업, 내가 정의하고 싶은 방식(질문에 매우 모호하게 설명되어 있기 때문에)은 key 와 값이 (또는 특정 값)인 요소의 값을 바꾸는 displayNameusername입니다 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

관련 정보