Mac 터미널에서 JSON 응답의 "name"을 구문 분석하려고 합니다.
{"created_at":"2012-08-27T20:04:27Z","deleted_at":null,"id":21462840,"item_type":"video","name":"CastingBy-v12 mix.mov", "private":true,"redirect_url":null,"remote_url":"http://f.cl.ly/items/3D0P02b3e3p2I/CastingBy-v12%20mixed.mov","source":"Cloud/1.5.4 CFNetwork/520.4.3 Darwin/11.4.0 (x86_64) (MacPro5%2C1)","updated_at":"2012-08-27T20:13:38Z","view_counter":2,"href":"http:/ / /my.cl.ly/items/2840","icon":"http://my.cld.me/images/item-types/video.png","구독":true,"url": " http://files.housenyc.com/1I3E2F3C","content_url":"http://files.eeehousenyc.com/1I3Q0Z1E2F3C/CastingBy-v12%20mixed.mov","download_url":"http://files . eeehousenyc .com/1I3Q0F3C/download/CastingBy-v12%20mixed.mov","gauge_id":null}
나는 그것을 사용하고 있다
sed 's/{.*?"name":"\(.+?\)".*/\1/'
그러나 전체 문자열을 반환합니다.
나는 그것이 돌아왔으면 좋겠다
CastingBy-v12 mixed.mov
답변1
sed만 사용하여 json을 구문 분석하는 것은 HTML을 구문 분석하는 것만큼 문제가 있습니다. 즉, 요소가 다른 요소에 포함될 수 있고 정규 표현식이 재귀를 지원하지 않기 때문에 정규 표현식만 사용하여 올바르게 구문 분석하는 것은 본질적으로 불가능합니다.
다음은 json을 구문 분석하고 검증하기 위한 PCRE 솔루션입니다.https://stackoverflow.com/questions/2583472/regex-to-validate-json- 아직 사용해본 적도 없고 테스트해본 적도 없어서 효과가 있다는 작가의 말을 받아들여야 하는데...하지만PCRE는 sed가 지원하는 기본 또는 확장 정규식에서 찾을 수 없는 많은 작업을 수행합니다.
어쨌든, IMO에서는 Perl, Python 또는 awk와 해당 언어의 json 구문 분석 라이브러리 중 하나 또는 전용 json 구문 분석 도구를 사용하는 것이 더 좋습니다. 여기에는 몇 가지가 언급되어 있습니다.
https://stackoverflow.com/questions/3858671/unix-command-line-json-parser
이들 중 하나는 쉘 스크립트에서 사용하기 위해 JSON 입력에서 데이터를 추출하는 데 사용될 수 있습니다. 아니면 전체 프로그램을 해당 언어로 작성할 수도 있습니다.
예를 들어, json 데이터를 python -mjson.tool로 파이핑하면 다음과 같은 결과가 생성됩니다.
$ echo "JSONDATA여기" python -m json.tools | { "content_url": "http://files.eeehousenyc.com/1I3Q0Z1E2F3C/CastingBy-v12%20mixed.mov", "생성 시간": "2012-08-27T20:04:27Z", "삭제_at": 비어 있음, "download_url": "http://files.eeehousenyc.com/1I3Q0F3C/download/CastingBy-v12%20mixed.mov", "gauge_id": 비어 있음, "href": "http://my.cl.ly/items/2840", "아이콘": "http://my.cld.me/images/item-types/video.png", "신분증": 21462840, "item_type": "동영상", "name": "CastingBy-v12 mix.mov", "비공개": 사실, "redirect_url": 비어 있음, "remote_url": "http://f.cl.ly/items/3D0P02b3e3p2I/CastingBy-v12%20mixed.mov", "출처": "클라우드/1.5.4 CFNetwork/520.4.3 다윈/11.4.0 (x86_64) (MacPro5%2C1)", "구독 중": 사실, "updated_at": "2012-08-27T20:13:38Z", "url": "http://files.housenyc.com/1I3E2F3C", "뷰 카운터": 2 }
그런 다음 다음과 같이 입력을 sed로 파이프할 수 있습니다.
$ echo "JSONDATAHERE" | python -m json.tool | sed -n -e '/"name":/ s/^.*"\(.*\)".*/\1/p'
CastingBy-v12 mixed.mov
sed 스크립트는 정규 표현식의 탐욕스러운 특성에 의존하여 "
포함된 행의 마지막에서 두 번째 문자와 마지막 문자 사이의 모든 내용을 추출합니다. "
"name":
답변2
찾고 있는 표현은 다음과 같습니다.
sed -e 's/^.*"name":"\([^"]*\)".*$/\1/' infile
결과는 다음과 같습니다
CastingBy-v12 mixed.mov
귀하의 오류에는 몇 가지 오류가 있습니다.
- 욕심 많은 표현에만
sed
허용됩니다 . :.*?
및.+?
둘 다 올바르지 않습니다. - 탈출 해야합니다
+
. [^"]*
정규식이 문자열의 마지막 큰따옴표와 일치하는 것을 방지하는 데 사용됩니다 .
답변3
이것은 귀하의 질문에 직접적으로 대답하지 않습니다. 그러나 이러한 작업을 정기적으로 수행해야 하는 경우 Perl, Python 또는 Ruby와 같은 범용 프로그래밍 언어를 사용하는 것이 좋습니다.
Ruby에서 솔루션은 다음과 같습니다.
some_command_that_emits_json | ruby -e "require 'rubygems';require 'json'; output=JSON.parse(STDIN.gets); puts output['name']"
답변4
JSON
모듈을 사용하여 이를 수행하는 한 가지 방법 은 다음과 같습니다 perl
.
json_producing_process | perl -MJSON -lne 'print from_json($_)->{name}'