yqとsedを使用してyamlの値を変更する

yqとsedを使用してyamlの値を変更する

ブロック引用

sedを使用して、以下のyamlブロックのipAddressキーの値を変更しようとしています。

networkInterfaces:
- network:
    id: network-1111   
    ipAddress: 192.168.0.0

Cmd:sed -i 's/\(.*ipAddress:.*\)/ipAddress: 192.168.0.1/g' filename.yaml これは実際には置き換えられますが、networkInterfacesの下にキーを入れ子にすることなく基本ブロックに配置します。

SED以降の出力

networkInterfaces:
  - network:
      id: network-1834
ipAddress: 192.168.0.1

頑張ったyq

yq -i '.networkInterfaces.ipAddress = "192.168.0.0"' filename.yaml

エラーが発生しました: 'ipAddress'を使用して配列をインデックス化できませんでした(strconv.ParseInt: 'ipAddress'解析:無効な構文)。

IpAddressの値を変更したいです。

ベストアンサー1

この答えはあなたですマイクパラyqユーティリティ(表示されるエラーメッセージによるとユーティリティです)。 アンドレイ・キースリュークyq少し違う。


networkInterfacesはリストなので、リスト要素にアクセスする場所を選択しないと、リストまたはnetworkその下にアクセスできません。ipAddress

要素が1つしかない場合は使用できます。

yq '.networkInterfaces[0].network.ipAddress = "192.168.0.1"' file

つまり、リストの最初の要素をipAddress文字列に設定します。networknetworkInterfaces192.168.0.1

ipAddress特定の項目に設定するにはid

yq '.networkInterfaces[] |= select(.network.id == "network-1111").network.ipAddress = "192.168.0.1"' file

シェル変数を使用してクエリidと新しいIP番号を保存するには、次の手順を実行します。

id=network-1111 newip=192.168.0.1 yq '.networkInterfaces[] |= select(.network.id == env(id)).network.ipAddress = env(newip)' file

おすすめ記事