任意のテキストを含むテキストファイルから.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がある場合は、ファイル全体をメモリにロードしてもそれを置き換えることができますgrepgrep -zoまたはperl -l -0777 -ne 'print for m{regexp-above}g'

おすすめ記事