변수 맵이 있고 bash 스크립트에서 특정 변수의 값을 동적으로 바꿔야 합니다. 내 변수는 다음과 같습니다
array = {
node1 = [
{
"apacheversion" = "1.0"
"mysqlversion" = "2.0"
}
]
node2 = [
{
"apacheversion" = "1.0"
"mysqlversion" = "2.0"
}
]
}
그래서 apacheversion과 mysqlversion 값을 'sed'로 바꿔야 합니다.
"apacheversion" = "new.value" "mysqlversion" = "new.value"
특정 노드에서만 실행하는 방법이 있나요? 예를 들어 node1만 교체하세요. 변수에 대한 임시 파일이므로 가능하지 않아도 상관 없습니다.
감사해요!
답변1
일반적으로 파서를 사용하는 것이 더 좋지만 한 가지 접근 방식은 awk
.regex를 통해 블록을 선택한 /start/,/end/
다음 해당 블록에서만 작업하는 것입니다.
awk '/node1 = \[/,/\]/ {
if ($0 ~ /apacheversion/) {gsub(/1.0/,"new.version")}
if ($0 ~ /mysqlversion/) {gsub(/2.0/,"new.version")}
} 1' file.terra
예를 들어 필드 구분 기호로 정의하면 패턴 일치 + 바꾸기를 =
사용하는 대신 더 일반적이고 필드 2에 있는 내용을 바꿀 수 있습니다 .gsub
이제 스크립트에서 이를 사용하려면 환경에서 변수를 가져옵니다.
#!/bin/bash
varAPA=2.0
varSQL=5.0
awk -v newAPA="$varAPA" -v newSQL="$varSQL" '/node1 = \[/,/\]/ {
if ($0 ~ /apacheversion/) {gsub(/1.0/,newAPA)}
if ($0 ~ /mysqlversion/) {gsub(/2.0/,newSQL)}
} 1' file.terra