在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 个文件。