(Mac 터미널) sed가 JSON을 구문 분석하고 있습니다...내가 뭘 잘못하고 있나요?

(Mac 터미널) sed가 JSON을 구문 분석하고 있습니다...내가 뭘 잘못하고 있나요?

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}'

관련 정보