出于某些极端原因,我不能使用jq或其他cli工具。我需要从与该人偶metadata.json匹配的所有json中提取“名称”的值。格式。
json可能没有正确格式化和缩进,但将有效。含义,空格和换行符,回车符可能会插入符合条件的位置。
请注意,依赖项数组中可能有“名称”元素。
因此,如何仅使用标准的UNIX命令和/或Shell脚本来提取值,而不安装jq之类的应用程序或其他工具?
谢谢!
{
"name": "examplecorp-mymodule",
"version": "0.0.1",
"author": "Pat",
"license": "Apache-2.0",
"summary": "A module for a thing",
"source": "https://github.com/examplecorp/examplecorp-mymodule",
"project_page": "https://forge.puppetlabs.com/examplecorp/mymodule",
"issues_url": "https://github.com/examplecorp/examplecorp-mymodule/issues",
"tags": ["things", "stuff"],
"operatingsystem_support": [
{
"operatingsystem":"RedHat",
"operatingsystemrelease":[ "5.0", "6.0" ]
},
{
"operatingsystem": "Ubuntu",
"operatingsystemrelease": [ "12.04", "10.04" ]
}
],
"dependencies": [
{ "name": "puppetlabs/stdlib", "version_requirement": ">=3.2.0 <5.0.0" },
{ "name": "puppetlabs/firewall", "version_requirement": ">= 0.0.4" }
]
}
这是丑陋的,可怕的,可怕的,不了解结构的,如果您的输入文件中有看起来与您要查找的内容相似的多余内容,则会给您不正确的结果-但是...
#!/bin/bash
# ^- NOT /bin/sh; shell-native regexes are a bash extension
contents=$(<in.json)
if [[ $contents =~ '"name":'[[:space:]]*'"'([^\"]*)'"' ]]; then
echo "Found name: ${BASH_REMATCH[1]}"
fi
现在,让我们讨论这个答案被打破的一些方法(并且使用jq会更好):
"dependencies": [ { "name": "puppetlabs/stdlib", "version_requirement": ">=3.2.0 <5.0.0" } ]
在"name": "examplecorp-mymodule"
之前,那么您猜得出了哪个结果? (为此,简单的解决方法是对空格/格式进行假设,因此不能针对同一数据的所有可能的JSON表达式进行证明。)&foo;
的符号的名称)。\"
子序列...那么,猜猜那里发生了什么?等等它不像尝试使用正则表达式解析XML那样糟糕(JSON更容易!),但还是很混乱。
这应该为您工作:
jq '.name' metadata.json