임의의 텍스트가 포함된 텍스트 파일에서 .json을 추출합니다.

임의의 텍스트가 포함된 텍스트 파일에서 .json을 추출합니다.

.json 콘텐츠가 포함된 임의의 텍스트를 제공하는 프로그램의 출력이 있습니다. 예를 들면 다음과 같습니다.

blablablabla
blablab some more text

blablablabla
blablab some more text
{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}


blablablabla
blablab some more text


blablablabla
blablab some more text

"jq"를 사용하여 구문 분석하기 위해 .json 외부의 텍스트를 정리하고 싶습니다.

이 텍스트가 필요합니다.

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

감사해요!

답변1

sed '/^{/,/^}/!d' < input

{로 시작하는 줄과 로 시작하는 다음 줄 사이에 포함된 파일 부분이 추출됩니다 }.

pcregrep -Mo '(?s)(\{(?:[^{}"]++|"(?:\\.|[^"])*+"|(?1))*\})' < file

(중첩 ), ( 문자열 내부) 또는 (문자열에서 이스케이프된 따옴표) {...}와 같은 입력을 처리할 수 있을 만큼 지능적으로 최상위 수준 쌍을 추출합니다 .{"x":{"y":1}}{}{ "x}" }}{ "x\"}" }

pcregrepPCRE 라이브러리와 함께 제공되는 PCRE 라이브러리가 없고 설치할 수 없지만 PCRE로 빌드된 GNU가 있는 경우 전체 파일을 메모리에 로드하더라도 grep이를 로 대체할 수 있습니다 . grep -zo또는 perl -l -0777 -ne 'print for m{regexp-above}g'.

관련 정보