Extraia .json de um arquivo de texto com texto arbitrário

3

Eu tenho uma saída de um programa que dá algum texto arbitrário, com coisas dentro .json como:

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

Eu quero limpar o texto fora do .json para analisá-lo com "jq".

Eu preciso apenas deste texto:

{
    "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"
                }
            }
        }
    }
}

Obrigado!

    
por jhd 00023 02.08.2018 / 15:47

1 resposta

4

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

Extrairia as partes do arquivo compreendidas entre linhas que começam com { e a próxima linha depois disso que começa com } .

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

Extrairia os pares de% de nível superior{...} s onde quer que eles estivessem, sendo inteligentes o suficiente para lidar com entradas como {"x":{"y":1}} (aninhado {} ) ou { "x}" } ( } dentro de cadeias) ou { "x\"}" } (aspas escapadas em strings).

Se você não tem e não pode instalar o pcregrep (vem com a biblioteca PCRE), mas você tem o GNU grep , construído com o PCRE, você pode substituir com grep -zo , apesar de carregar o arquivo inteiro em memória. Ou use perl -l -0777 -ne 'print for m{regexp-above}g' .

    
por 02.08.2018 / 15:52