在所有文件中找到JSON键,并删除相应的键值对。

我有很多文件,我需要在这些文件中找到一个字符串,如果这个字符串在那里,那么我需要从所有这些文件中删除这个字符串周围的json块。

比如说,我在寻找这个字符串

我正在寻找这个字符串 "1234" 在我所有的文件中。每个文件都有一个巨大的json块,里面有我想删除的字符串。所以在所有这些文件中,字符串是这样的,有以下两种格式。

第一种格式是:

...
"data": {
    "1234": {
        "tt": true
    }
}
...

第二种格式是: 数据里面有多个json对象。

...
"data": {
    "1234": {
        "tt": true
    },
    "7890": {
        "tt": true
    }
}
...

现在我需要用一些脚本来删除json对象。"1234" 完全。所以输出应该是。

对于第一种格式:

...
"data": {}
...

第二种格式的输出是:

...
"data": {
    "7890": {
        "tt": true
    }
}
...

可以这样做吗?我是在mac linux终端。我可以做grep搜索并找到文件,但不知道如何从所有文件中删除该字符串周围的json对象。

请注意。 每个json文件都是pretty格式的。

更新一下。

{
    "props": [
        {
            "property": "Hat",
            "data": {
                "1234": {
                    "tt": true
                },
                "7890": {
                    "tt": true
                }
            }
        }
    ]
}

这里是片段 https:/jqplay.orggsqXW_QUYFv0. 如果 property 价值是 Hat 那么只有我想删除存在的键,但如果属性值是其他东西,那么我不想删除该键。有什么办法可以让我们也增加这种变化吗?

解决方案:

更新

鉴于问题的更新,请看以下内容

jq '{props: [.props[] | (select(.property == "Hat") | del(.data["1234"])), select(.property != "Hat")]}'

在线试试吧!

这只是jq表达式本身。如果要在文件夹中的每个文件上运行它,只需在下面的bash循环中替换这个。

这个怎么样…

jq 'delpaths([paths] | map(select(.[]=="1234")))'

第一个例子

输入

{
    "data": {
        "1234": {
            "tt": true
        }
    }
}

产量

{
  "data": {}
}

在网上试试吧!

第二个例子

输入

{
    "data": {
        "1234": {
            "tt": true
        },
        "7890": {
            "tt": true
        }
    }
}

产量

{
  "data": {
    "7890": {
      "tt": true
    }
  }
}

在线试用

一个简单的bash脚本,在每个文件(如data-1.json)上运行这个脚本,并将其保存在原地…

for file in *.json; do
    jq 'delpaths([paths] | map(select(.[]=="1234")))' <"$file" >"$file.new" && mv "$file.new" "$file"
done

这是我能得到的最接近的,没有实际的输入输出而不是摘录。

希望能帮到你

本文来自投稿,不代表运维实战侠立场,如若转载,请注明出处:https://www.shizhanxia.com/299.html

(0)
上一篇 2022年6月29日 下午3:55
下一篇 2022年6月29日 下午3:55

相关推荐

发表评论

登录后才能评论