블록 인용
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
문자열로 설정합니다.network
networkInterfaces
192.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