파일의 값을 jq로 바꿉니다(한 줄).

파일의 값을 jq로 바꿉니다(한 줄).

"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이렇게 하는 데에는 몇 가지 이유가 있습니다.

  1. 추출한 값은 다음과 같을 수 있습니다.코딩된. ( ) 옵션과 함께 사용하면 도구 jq가 이를 디코딩합니다.-r--raw-output
  2. 사용시 값과 키를 구분하지 않기 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으로 인코딩됩니다.$newvalnewvaluejqjq

가독성을 위해 약간의 간격을 두십시오(질문에 태그가 지정되었으므로 이것이 쉘 스크립트의 일부라고 가정).):

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_OEevalue가 있는 키가 있는 모든 객체를 찾아 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

그것을 파괴:

  1. cat …file.json의 내용을 표준 출력(stdout)으로 복사합니다.
  2. |이 출력을 다음 명령의 표준 입력(stdin)으로 보냅니다.
  3. jq '.en.CTE_LG_LL_OE = "ready"'jq가 "필터"라고 부르는 기능( '.en.CTE_LG_LL_OE = "ready"'특정 키에 특정 값 할당) 이 있지만아니요입력 파일을 지정합니다. 이로 인해 jq해당 입력이 표준 입력에서 읽혀집니다.
  4. | 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

특정 표준 명령줄 옵션으로 이 동작이 변경될 수 있습니다.

관련 정보