Bash 从存储在配置文件中的类似JSON的格式获取具有特定键的结构的脚本
我将以下结构(类似JSON的格式)保存在配置文件中Bash 从存储在配置文件中的类似JSON的格式获取具有特定键的结构的脚本,bash,Bash,我将以下结构(类似JSON的格式)保存在配置文件中 exampleStruct = { valueOne = { irrelevant_key_1 = true; irrelevant_key_2 = true; relevant_key = true; }; valueTwo = { irrelevant_key_1 = true; irrelevant_key_2 = true;
exampleStruct = {
valueOne = {
irrelevant_key_1 = true;
irrelevant_key_2 = true;
relevant_key = true;
};
valueTwo = {
irrelevant_key_1 = true;
irrelevant_key_2 = true;
relevant_key = true;
};
valueThree = {
irrelevant_key_1 = true;
irrelevant_key_2 = true;
};
valueFour = {
irrelevant_key_1 = true;
relevant_key = true;
};
}
主结构内部的结构,即valueOne,valueTwo可能有或可能没有“相关的_键”作为键。
我想找到以“相关_键”作为键的结构。
因此,对于上面的示例,我希望以下列表存储在一个文件中
valueOne
valueTwo
valueFour
由于valueThree没有“相关_键”作为键
我对编写脚本完全陌生,使用jq是一种选择吗?
我不想把整个剧本作为答案,但是一个前进的方向会有很大帮助
谢谢首先,您需要将其转换为有效的JSON。这种诡计应该可以做到:
semiJson=$( printf "{\n%s\n}" "$( sed -E $'s/=/:/g;s/;/,/g;s/([a-zA-Z0-9_]+)/"\\1"/g;s/"true"/True/g' semiJson.sjson )")
okJson=$( python3 -c "
import json
dict = $semiJson
print(json.dumps(dict, indent=' '))
")
一旦您有了一个有效的JSON(本例中为okJson变量),您就可以轻松地使用JQ来实现您的目标:
echo "$okJson" | jq '.exampleStruct | with_entries(select(.value.relevant_key == true)) | keys'
[
"valueFour",
"valueOne",
"valueTwo"
]
如果有帮助,请告诉我 如果这是一个由人监督的一次性操作,您可以简单地grep以表格开始的行(或者是那些多个空格?)并包含等号。如果它的用途不止这些,那么您将需要该语言的解析器,无论它是直接用于提取所需的值,还是将数据转换为JSON,以便将数据馈送到
jq
。是的,只需执行一次。大约有3000个值可能有相关的键,也可能没有。你能告诉我上面这个例子的grep命令示例吗?我误解了你的要求,我不知道如何用grep
解决这个问题;下面的GNUsed
命令如下:search_for=“relevantKey”;sed-En“/^\s+\w+\s*=\s*{/{s/\s+(\w+)./\1/;h;:l n;/\b$search\u for\b/{x;p};/^\s+\};/b;b l}”输出文件
多么惊人的答案!将-r
选项置于jq
并在末尾添加[]
过滤器,使结果看起来与OP所需的输出类似,如何?