Bash Shell 脚本提取 Json 对象



在Bash shell脚本中,我想提取一个对象。例如,使用以下 json 文件,我想提取dependencies对象,它应该返回我:"dmg": ">= 0.0.0", "build-essential": ">= 0.0.0", "windows": ">= 0.0.0"以任何格式,您如何做到这一点?

我的数据 1.json:

{
    "platforms": {
        "amazon": ">= 0.0.0",
        "arch": ">= 0.0.0",
        "centos": ">= 0.0.0",
        "debian": ">= 0.0.0"
    },
    "dependencies": {
        "dmg": ">= 0.0.0",
        "build-essential": ">= 0.0.0",
        "windows": ">= 0.0.0"
    },
    "recommendations": {}
}

我的数据 2.json:

{
    "platforms": {
        "amazon": ">= 0.0.0",
        "arch": ">= 0.0.0",
        "centos": ">= 0.0.0",
        "debian": ">= 0.0.0"
    },
    "recommendations": {},
    "dependencies": {
        "dmg": ">= 0.0.0",
        "build-essential": ">= 0.0.0",
        "windows": ">= 0.0.0"
    }
}

我的数据 3.json:

{
    "dependencies": {
        "dmg": ">= 0.0.0",
        "build-essential": ">= 0.0.0",
        "windows": ">= 0.0.0"
    },
    "platforms": {
        "amazon": ">= 0.0.0",
        "arch": ">= 0.0.0",
        "centos": ">= 0.0.0",
        "debian": ">= 0.0.0"
    },
    "recommendations": {}
}

我的数据 4.json:

{
    "dependencies": {
        "dmg": ">= 0.0.0",
        "build-essential": ">= 0.0.0",
        "windows": ">= 0.0.0"
    }
}

我的数据 5.json (压缩):

{"dependencies":{"dmg":">= 0.0.0","build-essential":">= 0.0.0","windows":">= 0.0.0"},"platforms":{"amazon":">= 0.0.0","arch":">= 0.0.0","centos":">= 0.0.0","debian":">= 0.0.0"},"recommendations":{}}

你看过jsawk吗?我通常会使用 python 来解析 UNIX 系统上的 JSON 数据,因为它通常与操作系统捆绑在一起。

无论如何,你可以试试这个:

awk "/dependencies/,/}/ { print }" test.json | grep ":" | grep -v dependencies

通常,要获取两个模式/字符串之间的文本:

awk "/Pattern1/,/Pattern2/ { print }" inputFile

然后使用 grep ":" 获取对象中包含 ':"' 的所有行,然后通过获取不包含对象名称的所有后续行来过滤掉对象名称本身

更新:对于 JSON 格式不漂亮

sed "s/[,{}]/&n/g" prettified.json | awk "/dependencies/,/}/ { print }" | grep ":" | grep -v dependencies | awk '{$1=$1}1'

这是awk的一种方法:

awk -v RS= -F'},|{' '{print $5}' file | awk 'NF'

$ awk -v RS= -F'},|{' '{print $5}' f | awk 'NF'
    "dmg": ">= 0.0.0",
    "build-essential": ">= 0.0.0",
    "windows": ">= 0.0.0"

$ $ tr -d 'n' < myjson.json | sed -e's/[}{]//g' | sed -e's/.*dependencies":(.*)s*,.*/1/g' | sed -e's/^ *//g' | sed -e's/, */, /g'
"dmg": ">= 0.0.0", "build-essential": ">= 0.0.0", "windows": ">= 0.0.0"
sed -n '/dependencies/, /}/ p' t|grep '>='


这是如何工作的:

首先获取块dependencies之间的文本,然后提取依赖项。

请注意,此方法与依赖项块在文本中的位置无关。只要它存在,你就会得到答案。


aman@apollo:~$ sed -n '/dependencies/, /}/ p' t|grep '>='
        "dmg": ">= 0.0.0",
        "build-essential": ">= 0.0.0",
        "windows": ">= 0.0.0"

使用sed -n '/dependencies/, /}/ p' t|grep '.*='

如果可以有像 ~= 这样的符号,=在依赖块中(而不仅仅是 >= )。


压缩版对于压缩版本,您可以先"解压缩"(插入换行符)文件,然后应用相同的转换。
sed -e 's/:{/:{n/g'  -e  's/},/n},n/g' d5|sed -n '/dependencies/, /}/ p'|grep '>='

原始解决方案将适用于所有其他 4 个文件。

相关内容

  • 没有找到相关文章

最新更新