用于解析的Sed

用于解析的Sed,sed,Sed,我有档案: "data_personnel": [ { "id": "1", "name": "Mathieu" } ], "struct_hospital": [ { "id": "9", "geo": "chamb", "nb": "" }, { "id": "", "geo": "jsj", "nb": "SMITH"

我有档案:

"data_personnel": [
    {
        "id": "1",
        "name": "Mathieu"
    }
],
"struct_hospital": [
    {
        "id": "9",
        "geo": "chamb",
        "nb": ""
    },
    {
        "id": "",
        "geo": "jsj",
        "nb": "SMITH"
    },
    {
        "id": "10",
        "geo": "",
        "nb": "12"
    },
    {
        "id": "2",
        "geo": "marqui",
        "nb": "20"
    },
    {
        "id": "4",
        "geo": "oliwo",
        "nb": "1"
    },
    {
        "id": "1",
        "geo": "par",
        "nb": "5"
    }
]
如何使用sed获取所有值​​geo在struct_医院的作用?(chamb、jsj、marqui、oliwo等)
该文件可以是任何形式。如Sundeep所指出的那样,对于选项卡、一行中的所有内容等,使用合适的JSON解析器更有意义。 但是,如果您正在寻找一次性快速、肮脏的解决方案,那么这可能会:

sed -n '/^"struct_hospital"/,/^]/s/^.*"geo"\s*:\s*"\([^"]*\)"\s*,\?.*$/\1/p' input.txt
样本输出:

chamb
jsj

marqui
oliwo
par
说明:

    代码> /^“StuttHealthObjy//[^ ] /<代码> -只考虑<代码>结构>医院< /代码>和结束括号之间的行。
  • s/../\1/p
    搜索并替换;仅打印每个匹配行的第一个捕获子模式
  • ^.*“geo”\s*:\s*“\(.*\)”\s*,\?.*$
    匹配
    geo
    行;捕获冒号后面的值
如果输入跨越一行,您可以使用另一个
sed
调用作为预处理器来插入换行符:

sed 's/]\|,/\n&/g'
这将生成完整的命令:

sed 's/]\|,/\n&/g' input.txt | sed -n '/^"struct_hospital"/,/^]/s/^.*"geo"\s*:\s*"\([^"]*\)"\s*,\?.*$/\1/p'

如果这是json,不要使用sed。。使用类似于
jq
。。。另外,添加您试图质疑的代码。
文件可以是任何形式。使用制表符、一行中的所有内容等..
@Kent我误读了问题,错误地认为OP意味着所需的输出可以是任何格式。我编辑了我的答案;谢谢你指出这一点。我使用这个注释
sed-n/“struct\u hospital\”/,/^\],$/s/^[:blank:]*\“geo\:[[:blank:]\+\([^\“]*\”,/\1/p我的\u文件
,但如果我想获得nb的所有价值,它是行不通的。。。