jq - jq:如何将过滤后的结果分配到输入文件中?
问题描述
我有几个文件需要清理。我想对它们应用一个 jq 过滤器来删除所有具有空值的键。空我的意思是空字符串,空对象和数组,里面只有一个空字符串。
输入
{
"foo": {
"keep": "me",
"remove": "",
"nest": {
"keep": "me",
"remove": ""
},
"remove-me": {},
"remove-me-to": [""]
}
}
输出
{
"foo": {
"keep": "me",
"nest": {
"keep": "me"
}
}
}
为此,我有我的工作 jq 表达式:
walk(if type == "object" then with_entries(select(.value | (. != {} and . != [""] and . != ""))) else . end)
但是我没有成功重写输入文件。我的命令是:
jq '. |= walk(if type == "object" then with_entries(select(.value | (. != {} and . != [""] and . != ""))) else . end)' test.json
我有一个很好的终端输出,但文件仍然相同。
为什么输入文件没有更新?
解决方案
解决方案是使用 tmp 文件。
我创建了脚本clean.sh
#!/bin/sh
input=$1
tmp="tmp.json"
jq 'walk(if type == "object" then with_entries(select(.value | (. != {} and . != [""] and . != ""))) else . end)' $input > $tmp
mv $tmp $input
然后运行
sh ./clean.sh input.json
推荐阅读
- javascript - froala wysisyg 编辑器中字体大小的自定义文本输入
- flutter - 我应该什么时候覆盖 Flutter 中的 debugFillProperties?
- javascript - 有局部变量时如何使其无点?
- deep-learning - 如何找到上述神经网络决策边界的方程?
- r - 无法基于另一列 R Shiny 在数据框中创建新列
- python - 有没有更好的方法在数据类的列表中提供大量参数?
- webpack - webpack 热中间件:在哪里设置 __resourceQuery?
- c# - 为什么在第一次输出后控制台冻结输出?
- javascript - Nuxt.js:@pivale/nuxt-image-loader-module 不以图像样式创建图像
- c# - 悬停 UWP 时更改按钮颜色