2016-06-25 1 views
0

json 객체를 삭제해야하는 json 파일이 있습니다. sed 명령으로 만 삭제할 수있는 방법이 있습니다. 샘플 파일은 아래에 있습니다.Json 파일에서 Json 객체를 삭제하는 방법 BASH에서 sed 명령으로

{ 
     "name": "ABC", 
     "description": "XYZ", 
     "versions": { 

     }, 
     "json_class": "Chef::Environment", 
     "chef_type": "environment", 
     "default_attributes": { 

     }, 
     "override_attributes": { 
      "company": { 
      "xyz": { 
        "mailer":{ 
     "smtp_host": "Some IP", 
     "imap_host": "Some Host", 
    "imap_user": "Some UserId", 
    "reply_to": "Some User Id", 
    "outbound_user": "", 
    "imap_mail_domain": "compute.oraclecloud.com", 
    "imap_password": ""}, 

        "logicaldomainname": "" 
         } 
         } 
     } 
    } 

이 파일에서 sed 명령으로 파일에서 메일러 개체를 삭제하려고합니다. sed 명령으로 가능한지 알려주세요.

이 삭제의 주된 동기는이 개체를 새로운 메일러 개체로 바꾸는 것입니다. 그래서 다른 메일러 객체가 게시 될 다음 번에 xyz json 객체에 추가 할 것입니다.

예상 출력 :

{ 
     "name": "ABC", 
     "description": "", 
     "version": { 

     }, 
     "json_class": "Chef::Environment", 
     "chef_type": "environment", 
     "default_attributes": { 

     }, 
     "override_attributes": { 
      "Company": { 
      "XYZ": { 
        "logicaldomainname": "" 
         } 
         } 
     } 
    } 
+1

실제로 우리 기계에서 일부 라이센스 규정으로 인해 사용할 수 없습니다. 하지만 우리는 awk를 사용할 수 있습니다. –

+3

'sed'는 확실히 적합하지 않습니다. 'jq'가 옵션이 아니라면 Perl이나 Python을 사용하는 것을 고려해야합니다. 훌륭한 json 라이브러리가 있습니다. –

+1

에 예상 출력이 추가되었습니다. –

답변

1
$ awk -v RS='^$' -v ORS= '{sub(/"mailer":[^}]+},[[:space:]]+/,"")}1' file 
{ 
     "name": "ABC", 
     "description": "", 
     "versions": { 

     }, 
     "json_class": "Chef::Environment", 
     "chef_type": "environment", 
     "default_attributes": { 

     }, 
     "override_attributes": { 
      "Company": { 
      "XYZ": { 
        "logicaldomainname": "" 
         } 
         } 
     } 
    } 

위 한 번에 기록 한 줄을 구축하고 END 섹션에서 그것을 처리 할 것 다른 AWKS으로, 멀티 문자의 RS에 대한 GNU AWK를 사용하는 :

$ awk -v ORS= '{rec=rec $0 RS} END{sub(/"mailer":[^}]+},[[:space:]]+/,"",rec); print rec}' file 
{ 
     "name": "ABC", 
     "description": "", 
     "versions": { 

     }, 
     "json_class": "Chef::Environment", 
     "chef_type": "environment", 
     "default_attributes": { 

     }, 
     "override_attributes": { 
      "Company": { 
      "XYZ": { 
        "logicaldomainname": "" 
         } 
         } 
     } 
    } 
당신은 강하게 jq을 금지 라이센스 문제 해결을 고려해야한다
+0

감사합니다. @ED Morton, 첫 번째 것은 저에게 잘 작동합니다. –

+0

두 번째 대답은 예상 된 결과를 인쇄하고있는 것으로 보이지만 첫 번째 대답이 똑같이하는 동안 원래 파일에 변경되지는 않습니다. –

+1

여러분을 환영합니다. 다른 답변을 얻는 데 몇 시간을주고, 옆에있는 체크 표시를 한 번 클릭하기로 결정한 경우 (http://stackoverflow.com/help/someone-answers 참조). –

0

는 :

sed '/\"mailer\"/,/}/ d; /^$/d' 1.a 

"(당신이 입력 한있다) 모든 빈 줄을 삭제, 첫 }mailer에서 삭제".

는 ("제자리")

sed -i ... 

참고 파일을 덮어 쓰려면 : (당신 같은) 여러 파일을 사용할 수 있습니다.

+1

누군가의 사용자 아이디가'mailer'입니까? – chepner

+0

그러면 다른 사용자가 = 새 데이터베이스 ... –

관련 문제