首页 > 解决方案 > 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

我有一个很好的终端输出,但文件仍然相同。

为什么输入文件没有更新?

标签: jq

解决方案


解决方案是使用 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

推荐阅读