在所有文件中查找 JSON 键并移除对应的键值对

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


例如:


我正在寻找这个字符串 -"1234"在我的所有文件中。每个文件都有一个巨大的 json 块,其中包含我要删除的字符串。所以在所有这些文件中,字符串如下两种格式:


第一种格式是:


...

"data": {

    "1234": {

        "tt": true

    }

}

...

数据中包含多个 json 对象的第二种格式:


...

"data": {

    "1234": {

        "tt": true

    },

    "7890": {

        "tt": true

    }

}

...

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


对于第一种格式:


...

"data": {}

...

对于第二种格式:


...

"data": {

    "7890": {

        "tt": true

    }

}

...

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


注意:每个 json 文件的格式都很漂亮。


函数式编程
浏览 67回答 2
2回答

小唯快跑啊

更新鉴于更新的问题,请看看这个jq '{props: [.props[] | (select(.property == "Hat") | del(.data["1234"])), select(.property != "Hat")]}'这只是 jq 表达式本身。要在文件夹等中的每个文件上运行它,只需在下面的 bash 循环中替换它。这个怎么样 ...jq 'delpaths([paths] | map(select(.[]=="1234")))'第一个例子输入{&nbsp; &nbsp; "data": {&nbsp; &nbsp; &nbsp; &nbsp; "1234": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "tt": true&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}输出{&nbsp; "data": {}}第二个例子输入{&nbsp; &nbsp; "data": {&nbsp; &nbsp; &nbsp; &nbsp; "1234": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "tt": true&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; "7890": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "tt": true&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}输出{&nbsp; "data": {&nbsp; &nbsp; "7890": {&nbsp; &nbsp; &nbsp; "tt": true&nbsp; &nbsp; }&nbsp; }}一个简单的 bash 脚本,用于在每个文件(例如 data-1.json)上运行它并将其保存在适当的位置......for file in *.json; do&nbsp; &nbsp; jq 'delpaths([paths] | map(select(.[]=="1234")))' <"$file" >"$file.new" && mv "$file.new" "$file"done在没有实际输入/输出而不是摘录的情况下,这是我所能得到的。希望这可以帮助!

慕后森

“1234”总是一个键,还是也可以是一个值?它永远是一把钥匙。– 龙 3 小时前这是一个使用“walk/1”的简单直接的解决方案:walk(if&nbsp;type&nbsp;==&nbsp;"object"&nbsp;then&nbsp;with_entries(select(.key&nbsp;!=&nbsp;"1234"))&nbsp;else&nbsp;.&nbsp;end)处理多个文件多个文件的处理将取决于 (a) 文件的指定方式;(b) 您是否要覆盖这些文件,如果是,是有条件还是无条件,如果不是,使用什么文件名。简而言之,有多种变体。这是一个例子:for&nbsp;f&nbsp;in&nbsp;*.json do &nbsp;&nbsp;jq&nbsp;-f&nbsp;-program.jq&nbsp;"$f"&nbsp;>&nbsp;"$f.new" &nbsp;&nbsp;done其中 program.jq 包含walk上面显示的程序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python