유닉스 쉘을 사용하여 괄호 안의 모든 것을 찾아 바꾸기 - 몇 줄

유닉스 쉘을 사용하여 괄호 안의 모든 것을 찾아 바꾸기 - 몇 줄

쉘을 사용하여 json 파일의 상당 부분을 찾아 교체해야 합니다. 예를 들어 다음 파일이 있습니다.

{
  
  "Balise1": true,
  "Balise2": true,
  "OtherThingEnabled": false,
  "proxySettings": {
    "port": 0
  },
  "mailSettings": {},
  "maxRunningActivitiesPerJob": 5,
  "maxRunningActivities": 5,
}

괄호 안의 내용을 지워야 합니다."프록시 설정"다음으로 교체하세요.

"proxySettings": {
    "host": "my-proxy.host.com",
    "port": 80
}

파일 시작 부분에 몇 줄이 있는지 확인할 수 없습니다. 하나일 수도 있고, 여러 개일 수도 있고, 없을 수도 있습니다. 내가 확신하는 유일한 것은 괄호뿐입니다. 올바르게 들여쓰기가 필요합니다.

redex를 사용하여 sed 함수를 살펴봤지만 알 수 없는 행 수에 부딪혔습니다.

도울 수 있니? 감사해요

답변1

JSON 프로세서 사용 jq(입력은 유효한 JSON이지만 게시된 문서에는 후행 쉼표가 포함되어 있으므로 유효한 JSON이 아니라고 가정):

jq '.proxySettings = { host: "my-proxy.host.com", port: 80 }' file.json

그러면 proxySettings섹션이 지정된 값으로 설정되어 이전에 해당 키와 연결된 다른 값(있는 경우)을 덮어씁니다.

명령줄에서 두 개의 값을 전달하려면(아마도 셸 변수에서) 다음을 사용하세요.

myproxy=my-proxy.host.com
myport=80

jq --arg host "$myproxy" --argjson port "$myport" '.proxySettings = { host: $host, port: $port }' file.json

또는 더 짧음

myproxy=my-proxy.host.com
myport=80

jq --arg host "$myproxy" --argjson port "$myport" '.proxySettings = $ARGS.named' file.json

마지막 변형은 두 개의 키 와 명령줄에 제공된 값을 포함하는 내부 jq객체를 생성합니다. 이 개체는 입력 문서의 섹션에 할당됩니다.$ARGS.namedhostportproxySettings

--arg호스트 이름과 포트 번호를 사용하는 이유 --argjson는 호스트 이름은 JSON 문자열로 인코딩해야 하는 문자열이지만 포트 번호는 JSON 문자열로 인코딩하면 안되는 숫자 값이기 때문입니다.

모든 경우에 결과는 표준 출력에 기록됩니다. 새 파일 이름으로 리디렉션하거나 파이프를 통해 sponge file.json원본 파일을 출력으로 덮어쓰세요.

관련 정보