"CTE_LG_LL_OE" 값을 "경고"에서 "준비"로 바꾸고 싶습니다.
{ "abcd": { "aav": "on", "vvg": "iio7890_APPID", "ct": "b-tte", "eSL": true, "it": "https://%ght%.mjk.com/", "tpo": "i-1", "pd": false, "pm": false, "pr": "" }, "en": { "CTE_LG_LL_OE": "warn", "S_G_EL_OD": "INFO", "G_LG_EL_OVE": "info" }, "EN_HTTPS": false }
다음 명령을 사용하여 파일에서 동일한 내용을 찾을 수 있는데 어떻게 라이너 명령으로 바꿀 수 있습니까?
jq '.' /abc/temp/config.json | grep CTE_LG_LL_OE
답변1
도착하다얻다키 값의 경우 JSON 인식 도구를 대신 사용합니다 jq
. grep
이렇게 하는 데에는 몇 가지 이유가 있습니다.
- 추출한 값은 다음과 같을 수 있습니다.코딩된. ( ) 옵션과 함께 사용하면 도구
jq
가 이를 디코딩합니다.-r
--raw-output
- 사용시 값과 키를 구분하지 않기
grep
때문에 추출할 의도가 없는 데이터가 실수로 추출될 수 있습니다.
CTE_LG_LL_OE
최상위 항목에서 키 값을 추출합니다 en
.
jq -r '.en.CTE_LG_LL_OE' file
값을 문자열로 설정 ready
하고 결과 문서를 파일에 씁니다 new-file
.
jq '.en.CTE_LG_LL_OE |= "ready"' file >new-file
이 |=
연산자는 왼쪽에 있는 키의 "경로"와 오른쪽에 있는 키의 새 값을 사용하는 "업데이트 연산자"입니다.
쉘 변수의 값을 설정하려면 다음을 수행하십시오.
jq --arg newval "$newvalue" '.en.CTE_LG_LL_OE |= $newval' file >new-file
이는 jq
쉘 변수에서 호출된 변수를 생성한 다음 이를 표현식에 사용합니다. 변수의 값은 자동으로 .json으로 인코딩됩니다.$newval
newvalue
jq
jq
가독성을 위해 약간의 간격을 두십시오(질문에 태그가 지정되었으므로 이것이 쉘 스크립트의 일부라고 가정).쉘 스크립트):
jq --arg newval "$newvalue" \
'.en.CTE_LG_LL_OE |= $newval' file >new-file
파일의 내부 편집( jq
내부 편집은 기본적으로 지원되지 않음):
tmpfile=$(mktemp)
cp file "$tmpfile" &&
jq --arg newval "$newvalue" \
'.en.CTE_LG_LL_OE |= $newval' "$tmpfile" >file &&
rm -f "$tmpfile"
세리프체로:
tmpfile=$(mktemp); cp file "$tmpfile" && jq --arg newval "$newvalue" '.en.CTE_LG_LL_OE |= $newval' "$tmpfile" >file && rm -f "$tmpfile"
확실하지 않은 경우어디문서 구조에서 CTE_LG_LL_OE
키는 에 있으며 값을 업데이트하려고 합니다.모두 CTE_LG_LL_OE
값이 포함된 키 warn
:
jq '
(
.. |
select(type == "object" and .CTE_LG_LL_OE? == "warn").CTE_LG_LL_OE
) |= "ready"' file
이는 문서 전체의 모든 키와 값을 재귀적으로 확인합니다. CTE_LG_LL_OE
evalue가 있는 키가 있는 모든 객체를 찾아 warn
업데이트합니다 ready
. 줄 바꿈은 단지 가독성을 위한 것입니다.
이전과 같이 쉘 변수에서 값을 얻을 수 있습니다.
jq --arg newval "$somevariable" '
(
.. |
select(type == "object" and .CTE_LG_LL_OE? == "warn").CTE_LG_LL_OE
) |= $newval' file
분명히 이 답변의 전반부에 표시된 것처럼 이는 내부 편집과 결합될 수도 있습니다.
답변2
file.json의 샘플 콘텐츠의 경우 다음 한 줄의 코드가 작동합니다.
cat file.json | jq '.en.CTE_LG_LL_OE = "ready"' | tee file.json
그것을 파괴:
cat …
file.json의 내용을 표준 출력(stdout)으로 복사합니다.|
이 출력을 다음 명령의 표준 입력(stdin)으로 보냅니다.jq '.en.CTE_LG_LL_OE = "ready"'
jq가 "필터"라고 부르는 기능('.en.CTE_LG_LL_OE = "ready"'
특정 키에 특정 값 할당) 이 있지만아니요입력 파일을 지정합니다. 이로 인해jq
해당 입력이 표준 입력에서 읽혀집니다.| tee
표준 출력에 기록하는 명령jq
으로 출력 보내기tee
그리고지정된 파일.
나는 내 행동에 혼란을 느낀 후에 이 문제를 발견했습니다 jq
. 어떤 이유에서인지 (답변 비교https://stackoverflow.com/questions/48964305/write-output-to-a-file-after-piped-to-jq) 출력 리디렉션아니요작동하면 jq
파일 자체도 읽히지 않습니다. 간단히 말해서, 다음 중 어느 것도 file.json을 잘라내어 완전히 비워지게 만들지 않습니다.
jq '.en.CTE_LG_LL_OE = "ready"' file.json >file.json
jq '.en.CTE_LG_LL_OE = "ready"' file.json | tee file.json
cat file.json | jq '.en.CTE_LG_LL_OE = "ready"' >file.json
특정 표준 명령줄 옵션으로 이 동작이 변경될 수 있습니다.