파일 이 있는데 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 와 값이 (또는 특정 값)인 요소의 값을 바꾸는 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