여러 줄이 포함된 파일에서 다음 문자열을 다른 문자열로 바꾸려고 합니다.
"schema" : "AAAAA",
도착하다
"schema" : "BBBBB",
현재 "스키마"를 사용하여 해당 행을 가져오기 위해 다음 명령을 실행하고 있습니다.
현재 아키텍처 =cat test.json | grep schema | awk {'print $3'}
그러면 "AAAAAA"라는 값이 표시됩니다.
AAAAA를 BBBBB로 바꾸고 싶습니다
다음 명령을 사용했습니다.
sed -e 's/$currentSchema/BBBBB/p' test.json
단, 동일한 파일 내에서는 교체할 수 없습니다.
답변1
JSON 파일 예:
[
{
"host": "myhost",
"schema": "AAAAA",
"lunch": "sandwich"
},
{
"host": "myotherhost",
"schema": "QQQQQ",
"lunch": "pizza"
}
]
우리는 각각을 다음과 같이 바꾸고 싶습니다 schema
.AAAAA
BBBBB
jq
$ jq 'map(if .schema == "AAAAA" then .schema = "BBBBB" else . end)' file.json
[
{
"host": "myhost",
"schema": "BBBBB",
"lunch": "sandwhich"
},
{
"host": "myotherhost",
"schema": "QQQQQ",
"lunch": "pizza"
}
]
다음과 같은 경우 이전 스키마가 무엇인지는 중요하지 않습니다.
$ jq 'map(.schema = "BBBBB")' file.json
[
{
"host": "myhost",
"schema": "BBBBB",
"lunch": "sandwhich"
},
{
"host": "myotherhost",
"schema": "BBBBB",
"lunch": "pizza"
}
]
이는 적절한 JSON 파서 이므로 jq
파일이 더 컴팩트한 형식(예: 한 줄)으로 렌더링되는 경우에도 작동합니다.
[{"host":"myhost","schema":"AAAAA","lunch":"sandwhich"},{"host":"myotherhost","schema":"QQQQQ","lunch":"pizza"}]
~을 위한실제질문(댓글에서), 즉 값이 포함된 키가 있는 요소를 찾아 .rules.behavior[]
해당 .name
요소 를 다른 값으로 mPulse
변경합니다 ..options.apiKey
jq '.rules.behaviors = [.rules.behaviors[]|select(.name == "mPulse").options.apiKey = "XXX"]' file.json
즉, 키가 있는 요소가 새 요소를 가져오는 .rules.behaviour
방식으로 배열을 다시 작성합니다 ..name
mPulse
.options.apiKey
답변2
일부 최적화 중 가장 중요한 것은 "쓸모없는 사용 cat
"을 피하는 것입니다. cat file | grep pattern
그럴 필요는 없습니다 grep pattern file
. grep
ping 을 원하므로 awk
다음과 같이 단순화할 수도 있습니다.
currentSchema="$( cat test.json | grep schema | awk '{print $3}' )"
~이 되다
currentSchema="$( awk '/schema/ {print $3}' test.json )"
이제 sed
스크립트를 작성하세요. 당신은 사용하고 있습니다강한 인용( '
)를 sed 명령 주위에 추가하면 쉘 변수가 구문 분석되지 않음을 의미합니다. 당신은 사용해야합니다약한 인용문( "
) 이렇게 하려면 다음을 수행합니다.
currentSchema="$( awk '/schema/ {print $3}' test.json )"
sed --in-place "s/$currentSchema/BBBBB/" test.json
답변3
grep
, , 가 필요하지 않으며 awk
이를 위해 모든 작업이 완료됩니다(테스트되지 않음).sed
awk
awk '/schema/ {$3 = "BBBBB"} 1' test.json > /tmp/$$ && mv /tmp/$$ test.json
시도해보고 다시 보고해 주세요.