文字列を見つけて最初の文字列を見つけ、次の行の別の文字列に置き換えます。

文字列を見つけて最初の文字列を見つけ、次の行の別の文字列に置き換えます。

以下の内容を含むファイルが提供されます。

pkg1:
  replicaCount: 1
  image:
    tag: latest
    pullPolicy: Always

pkg2:
  replicaCount: 2
  image:
    tag: latest
    pullPolicy: Always

tag特定のパッケージ(例:)に追加されたコンテンツを検索して別のパッケージ(例:)にpkg1置き換えると、次のような結果が得られます。latestjunk

pkg1:
  replicaCount: 1
  image:
    tag: junk
    pullPolicy: Always

pkg2:
  replicaCount: 2
  image:
    tag: latest
    pullPolicy: Always

この投稿への回答に感謝します(文字列を探して最初の文字列を見つけたら、別の文字列を置き換えます。)「ex」を使用してこれを行うことができます。

printf "%s\n" "/pkg1//latest/s//junk/" x | ex info.txt;

ところで問題は「ex」のないイメージで実行される点だ。

"awk"でこれを行う方法はありますか?私はファイルを1行ずつ読み、そのような方法でいくつかの作業を実行できると思いますが、より簡単な方法を探していました。一行であれば問題ありません。これが最初のものか2番目のものかを常に想定することはできません。そのため、パッケージ名を検索してそのパッケージのタグを置き換えるだけです。

ベストアンサー1

最も簡単な方法は、コマンドラインYAMLパーサーを使用することです。

$ yq -y '.pkg1.image.tag |= "junk"' file
pkg1:
  replicaCount: 1
  image:
    tag: junk
    pullPolicy: Always
pkg2:
  replicaCount: 2
  image:
    tag: latest
    pullPolicy: Always

私はそれを使用していますyqAndrei Kislyuk jqYAMLドキュメントラッパー(他のツールyqも呼び出されますので、正しいツールを使用していることを確認してください。)

このコマンドは.pkg1.image.tagキー値をstringに設定しjunk、この-yオプションはデフォルトのJSONの代わりにYAML出力を生成するために使用されます。

yq私はこれがDebianベースのLinuxディストリビューションのデフォルトであると思います。 YAML文書をJSONに変換し、jq次のように変更する必要があります。

$ yq r -j file.yml | jq '.pkg1.image.tag |= "junk"' | yq r -P -
pkg1:
  replicaCount: 1
  image:
    tag: junk
    pullPolicy: Always
pkg2:
  replicaCount: 2
  image:
    tag: latest
    pullPolicy: Always

おすすめ記事