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
在没有实际输入/输出而不是摘录的情况下,这是我所能得到的。
希望这可以帮助!

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
上面显示的程序。
添加回答
举报