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

関連情報