将 JSON "Pretty" 格式解析为一行

Parsing JSON "Pretty" format to one liner

我在我的一个系统上 运行 命令,它输出 JSON "pretty" 格式,如下所示:

[
    {
        "server": "servename1",
        "i.p": 127.0.0.1,
        "domain": "generic",
        "OS": "RHEL",
        "Version": 7.0
    },
    {
        "server": "servename2",
        "i.p": 127.0.0.1,
        "domain": "generic",
        "OS": "RHEL",
        "Version": 7.0
   },
    {
        "server": "servename3",
        "i.p": 127.0.0.1,
        "domain": "generic",
        "OS": "RHEL",
        "Version": 7.0
    }
]

我需要像这样在一行中解析这些段落:

[{"server":"servename1","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename2","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename3","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},]

最简单的方法是什么?我尝试使用 SED 和 JQ,但无法使用。

如果您的输入总是那么规律:

$ awk '{ORS=(/},|\]/?RS:""); gsub(/[[:blank:]]+/,""); sub(/}$/,"},")}1' file
[{"server":"servename1","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename2","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename3","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},]

如果这对您的真实输入不起作用,请编辑您的问题以包含更具代表性的样本输入。

要跳过 [] 行:

$ awk '!/^[][]/{ORS=(/},/?RS:""); gsub(/[[:blank:]]+/,""); sub(/}$/,"},\n"); print}' file
{"server":"servename1","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename2","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},
{"server":"servename3","i.p":127.0.0.1,"domain":"generic","OS":"RHEL","Version":7.0},

如果你对换行符没有问题,你可以在 jq 中试试这个 JSON:

$ jq -c ".[]" test.json
{"server":"servename1","i.p":"127.0.0.1","domain":"generic","OS":"RHEL","Version":7}
{"server":"servename2","i.p":"127.0.0.1","domain":"generic","OS":"RHEL","Version":7}
{"server":"servename3","i.p":"127.0.0.1","domain":"generic","OS":"RHEL","Version":7}

请注意,我不得不引用您示例中的 IP 地址,因为您发布的 JSON 无效 JSON。