为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

函数式编程 2022-10-18 19:42:58
我有很多文件需要在其中找到一个字符串,如果该字符串存在,那么我需要从所有这些文件中删除该字符串周围的 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 文件的格式都很漂亮。
查看完整描述

2 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

更新


鉴于更新的问题,请看看这个


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


在没有实际输入/输出而不是摘录的情况下,这是我所能得到的。


希望这可以帮助!


查看完整回答
反对 回复 2022-10-18
?
慕后森

TA贡献1802条经验 获得超5个赞

“1234”总是一个键,还是也可以是一个值?

它永远是一把钥匙。– 龙 3 小时前

这是一个使用“walk/1”的简单直接的解决方案:

walk(if type == "object" then with_entries(select(.key != "1234")) else . end)

处理多个文件

多个文件的处理将取决于 (a) 文件的指定方式;(b) 您是否要覆盖这些文件,如果是,是有条件还是无条件,如果不是,使用什么文件名。

简而言之,有多种变体。这是一个例子:

for f in *.json
do
  jq -f -program.jq "$f" > "$f.new"
  done

其中 program.jq 包含walk上面显示的程序。


查看完整回答
反对 回复 2022-10-18
  • 2 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信