2017-12-05 24 views
0
유닉스에

의 OS에 아무것도 추가하지 않고 나는 단지 "코드 뷰"의 "텍스트"라인을 추출 할 수있는 방법 (즉, 단지 그렙, AWK, 을 나오지도를 사용하여 등을 컷) 섹션에서 무시하십시오 ("probableStartLocationView"섹션에서 무시하십시오)? 당신이 정말로 OS는 도구를 포함 사용해야하는 경우다중 문자 구분 기호로 파일을 분할하는 방법은 무엇입니까?

. . . 
     "events" : [ { 
"id" : "12345", 
"important" : true, 
"type" : "Creation", 
"description" : "Something happened here", 
"extraDetails" : null, 
"codeView" : { 
    "lines" : [ { 
    "fragments" : [ { 
     "type" : "NORMAL_CODE", 
     "value" : "str = wrapper.getParameter(" 
    }, { 
     "type" : "CODE_STRING", 
     "value" : ""abcd"" 
    }, { 
     "type" : "NORMAL_CODE", 
     "value" : ")" 
    } ], 
    "text" : "str = wrapper.getParameter("abcd")" 
    } ], 
    "nested" : false 
}, 
"probableStartLocationView" : { 
    "lines" : [ { 
    "fragments" : [ { 
     "type" : "STACKTRACE_LINE", 
     "value" : "<init>() @ JSONInputData.java:72" 
    } ], 
    "text" : "<init>() @ JSONInputData.java:72" 
    } ], 
    "nested" : false 
}, 
. . . 
+1

흠. grep, awk, sed, cut 등으로'json'을 파싱하는 것이 최선의 방법은 아닙니다 ... awk로 작성된 json 파서 (https://github.com/step-/JSON)를 확인할 수 있습니다. .awk) 또는 [JSON.sh] (https://github.com/dominictarr/JSON.sh)하지만'jq '를 사용하는 것이 가장 좋은 방법입니다. – jm666

답변

0

, 당신은 그런 식으로 뭔가를 시도 할 수 있습니다 :

JSONString='"codeView" : { "lines" : [ { "fragments" : [ { "type" : "NORMAL_CODE", "value" : "str = wrapper.getParameter(" }, { "type" : "CODE_STRING", "value" : ""abcd"" }, { "type" : "NORMAL_CODE", "value" : ")" } ], "text" : "str = wrapper.getParameter("abcd")" } ], "nested" : false },' 

function jsonParse() { 
    awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'$1'\042/){print $(i+1)}}}' | tr -d '"' | sed -n 1p 
} 

printf "$(echo $JSONString | jsonParse text)" 

주의 사항 :을이 그것을 할 모든 안전한 방법에 있지으로 그것은 JSON 구문을 구문 분석하지 않습니다. 그냥 text 키를 추출합니다.

데모 가능 here.

그러나 예에서는 두 개의 text 키가 있으므로이 코드는 의 첫 번째 문자는입니다. 첫 번째 코드 뒤에 text 키가 필요하면 조금 위의 코드를 변경해야합니다. sed이 필요한 정확한 라인을 목표로해야합니다. 당신이

sed -n 2p 

대신 sed -n 1p의 작성합니다 당신이 "codeView" 블록에서 두 번째 text 필요하다고.

두 번째키의 데모는 here입니다.

0

JQ 프로세서 (.events 입력 JSON 구조의 첫번째 레벨의 키라고 가정)과 원하는 방법 :

jq -r '.events[0].codeView.lines[0].text' input.json 

출력 :

str = wrapper.getParameter(&quot;abcd&quot;) 
0

이 당신을 위해 일할 수도 있습니다 (GNU sed) :

sed -n '/^"[^"]*"/h;//!G;/"text".*\n"codeView"/P;d' file 

현재 섹션을 보류 공간에 저장하고 해당 섹션 내의 각 행에 추가하십시오. grep와 같은 옵션을 사용하면 -n 라인이 정상적으로 인쇄되는 것을 방지하고 정규 표현식을 사용하여 사용자의 기준에 맞는 라인을 인쇄 할 수 있습니다.