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

요소가 하나만 있는 경우 사용할 수 있습니다.

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

관련 정보