SED는 yaml의 다음 줄을 대체합니다.

SED는 yaml의 다음 줄을 대체합니다.

태그 값을 바꾸려고 하는데 sed가 작동하지 않습니다.

파일의 모양은 다음과 같습니다. 태그 값을 고유하게 바꾸고 싶습니다.

app1:
  tag: "dev-0.114"
  repository: kafka
  pullPolicy: Always


app2:
  tag: "dev-0.59"
  repository: nginx
  pullPolicy: Always

이것이 내가 시도한 것입니다.

 sed -i "" "/^\(app1.*[[:space:]]*tag: \).*/s//\1dev-0.115/" values.yaml

하지만 일하지 않아

답변1

.app1.tag값을 문자열로 변경하려면 내부 편집에 from을 사용하세요.dev-0.115yqhttps://github.com/kislyuk/yq(이것은 jq래퍼입니다):

$ cat file.yml
app1:
  tag: "dev-0.114"
  repository: kafka
  pullPolicy: Always


app2:
  tag: "dev-0.59"
  repository: nginx
  pullPolicy: Always
$ yq -i -y '.app1.tag = "dev-0.115"' file.yml
$ cat file.yml
app1:
  tag: dev-0.115
  repository: kafka
  pullPolicy: Always
app2:
  tag: dev-0.59
  repository: nginx
  pullPolicy: Always

일부 Linux 시스템에 있는 방법을 사용하여 yq문서를 JSON으로 변환하고 에서 수정한 jq다음 다시 변환하여 파일에 씁니다 newfile.yml.

$ yq -j r file.yml | jq '.app1.tag = "dev-0.115"' | yq -P r - >newfile.yml
$ cat newfile.yml
app1:
  tag: dev-0.115
  repository: kafka
  pullPolicy: Always
app2:
  tag: dev-0.59
  repository: nginx
  pullPolicy: Always

답변2

당신은 읽을 수있다N패턴 공간에 추가 행을 삽입하려면 명령을 사용하십시오 n. 그래서 주어진

$ cat file.yaml
app1:
  tag: "dev-0.114"
  repository: kafka
  pullPolicy: Always


app2:
  tag: "dev-0.59"
  repository: nginx
  pullPolicy: Always

그 다음에

$ sed '/^app1:/{n;s/tag:.*/tag: "dev-0.115"/;}' file.yaml
app1:
  tag: "dev-0.115"
  repository: kafka
  pullPolicy: Always


app2:
  tag: "dev-0.59"
  repository: nginx
  pullPolicy: Always

답변3

이 작업에서는 사용 가능한 가장 간단한 도구를 사용하겠습니다.

tr -d '"' < file.yml

관련 정보