2016-10-29 4 views
4

80 개 이상의 필드가있는 JSON이 있습니다. jq를 사용하여 아래에 언급 된 JSON 파일에서 메시지 필드를 추출하는 동안 줄 바꿈 문자와 탭 공백이 표시됩니다. 이스케이프 시퀀스 문자를 제거하고 sed를 사용하여 시도했지만 작동하지 않았습니다.JSON 파일에서 줄 바꿈, 탭 및 캐리지 리턴과 같은 이스케이프 시퀀스 문자를 제거하십시오.

샘플 JSON 파일 :

{ 
"HOSTNAME":"server1.example", 
"level":"WARN", 
"level_value":30000, 
"logger_name":"server1.example.adapter", 
"content":{"message":"ERROR LALALLA\nERROR INFO NANANAN\tSOME MORE ERROR INFO\nBABABABABABBA\n BABABABA\t ABABBABAA\n\n BABABABAB\n\n"} 
} 

이 사람이 나를 도와 드릴까요? 귀하의 의견으로

+0

** 그래서 ** 그 파일에 개행 문자 나 탭 문자를 원하지 않습니까? 또는 한 파일에 여러 항목이 있습니까? (Q를 업데이트하십시오.이 주석을 삭제하겠습니다). 행운을 빕니다. – shellter

+1

'-r' 옵션을 사용하면'jq'는 이스케이프 시퀀스를 실제 뉴 라인이나 탭 등으로 변환 할 것입니다. 'jq -r .content.message file.json'? – hek2mgl

+1

아니요 개행 및 탭 공백을 제거하고 싶습니다. – user3792699

답변

2

순수 jq 솔루션 :

$ jq -r '.content.message | gsub("[\\n\\t]"; "")' file.json 
ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB 

당신이 enlosing " 문자를 유지하려면이 -r를 생략합니다.

는 참고 : peak's helpful answerUnicode category specifier, \p{Cc}의 방법으로 ASCII, 라틴-1 유니 코드 범위에서 모든 제어 문자와 일치하는 일반화 정규 표현식을 포함합니다. jqOniguruma 정규식 엔진을 사용합니다. 같은 sedtr 같은 추가 유틸리티를 사용


다른 솔루션 . 그러나, 둘러싸 "가 여전히 있음을

$ jq '.content.message' file.json | sed 's/\\[tn]//g' 
"ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB" 

참고 : 무조건 이스케이프 시퀀스 \nt을 제거하기 위해 sed를 사용

.

$ jq '.content.message' file.json | sed 's/\\[tn]//g; s/"\(.*\)"/\1/' 
ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB 

또한 둘러싸 " 제거하는 간단한 옵션 (: 출력이 후행 \n가 없습니다 참고 :) : 는 sed 명령에 다른 대체를 추가, 제거하려면

$ jq -r '.content.message' file.json | tr -d '\n\t' 
ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB 

참고 -r이 얼마나 jq 문자열 (확장 \n\t 시퀀스)로 삽입 한 다음 리터럴로으로 제거합니다..

+0

나는 이미 내 질문에 새 줄과 탭 공백과 같은 이스케이프 시퀀스 문자를 제거하고 싶다는 말을했다. – user3792699

+0

알았네; 내 업데이 트를 참조하십시오. – mklement0

+1

그것은 효과가 있었다. @ mklement0 – user3792699

3

, 다음 주문 :

$ jq 'walk(if type == "string" then gsub("\\p{Cc}"; "<>") else . end)' 

는 생산 :

  • 당신이 사용할 필요가 있습니다

    물론
    { 
        "HOSTNAME": "server1.example", 
        "content": { 
        "message": "ERROR LALALLA<>ERROR INFO NANANAN<>SOME MORE ERROR INFO<>BABABABABABBA<> BABABABA<> ABABBABAA<><> BABABABAB<><>" 
        }, 
        "level": "WARN", 
        "level_value": 30000, 
        "logger_name": "server1.example.adapter" 
    } 
    

    은, 위의 호출은 단지 예시 walk/1. (walk/1은 입력 JSON을 처리합니다.)

  • 다른 문자 클래스를 사용하거나 gsub/2 호출의 파이프 라인을 지정할 수 있습니다.
  • 단순히 제어 문자를 생략하려면 gsub/2의 두 번째 인수로 ""를 지정하십시오.

당신이 walk/1를 사용하고 싶어하지만 JQ 그것은 다음 단순히 호출하기 전에 정의 (예 : here와 같은 웹에서 쉽게 사용할 수)를 추가하지 않을 경우.

+0

++는 몇 가지 고급 기술을 제공하지만 사실은 간단한'jq -r '.content.message | 우연한/일반화 된 정보에 의해 답변에서 파생 될 수있는 gsub ("[\\ n \\ t]"; "") 'file.json' 솔루션이 가려집니다. – mklement0

+0

@ mklement0 - (1)이 질문에는 "JSON 파일에서"라는 문구가 포함되어 있으며 많은 수의 필드가 언급되어 있습니다. 실제로 필요한 것이 명확하지 않기 때문에 일반적으로 유용한 대답이 더 일반적으로 유용 할 것이라고 생각했습니다 :-)) (2) "escape sequence characters"와 TAB, NL 및 CR을 특별히 언급하는 반면, 이 의견에 3 가지를 모두 포함하지는 않습니다. – peak

+0

공정한 점 - 설명 자체와 설명 데이터와 샘플 데이터 사이의 모호성이 종종 있습니다 ("줄 바꿈 문자 및 탭 공백 [sic]"은 "이스케이프 시퀀스"와 함께 언급됩니다). 나는 개인적으로 당신의 대답이 매우 유용하고 그것으로부터 배웠다는 것을 발견하지만, 나의 지적은 더 많은 맥락을 가진 "더 온화한"틀이 도움이되었을 수 있다는 것이 었습니다. – mklement0