Bash 从存储在配置文件中的类似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;

我将以下结构(类似JSON的格式)保存在配置文件中

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;
    };
}
主结构内部的结构,即valueOnevalueTwo可能有或可能没有“相关的_键”作为键。 我想找到以“相关_键”作为键的结构。 因此,对于上面的示例,我希望以下列表存储在一个文件中

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
解决这个问题;下面的GNU
sed
命令如下:
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所需的输出类似,如何?