使用jq从JSON对象中删除键:值

时间:2018-01-30 19:21:25

标签: json key edit jq

我正在尝试添加和删除关键字:值'使用jq从JSON对象。我是新的使用jq,我不明白jq向我投掷的错误,所以任何帮助推动我正确的方向非常感谢。我的具体问题是我有一个JSON对象(下面),我希望能够从JSON对象添加/删除“maxHeight”键/值。

我尝试了一些错误的命令......

sudo rmmod pn533 ## unload the driver right now
sudo nfc-list ## now it works...
  

无法迭代null(null)

jq 'recurse(.[]) |= del(.maxHeight)' new.json   
  

不能遍历字符串("功能")

 jq 'recurse(.[]) |= {maxHeight}' new.json
  

无法使用字符串" style"

索引字符串

new.json文件看起来像这样......

jq 'recurse(.[]) |= .maxHeight' new.json 

5 个答案:

答案 0 :(得分:2)

有两种方法:

以下说明了全球方法:

walk(if type == "object" and has("maxHeight") then del(.maxHeight) else . end)

这实际上是"编辑"通过更新任何具有指定键的对象来输入。

如果您的jq没有walk/1,只需在调用之前包含其def(例如来自https://raw.githubusercontent.com/stedolan/jq/master/src/builtin.jq)。

答案 1 :(得分:2)

使用jq-1.6,这会从输入中删除键.maxHeight(如果之前不存在,它甚至不会抱怨):

jq 'del(.maxHeight)' new.json

答案 2 :(得分:1)

这里是一个示例,该示例从Electrum Wallet JSON文件中删除了几个键,这已在zsh和bash中进行了测试,其jq版本没有内置walk

jq -f <(
  curl https://raw.githubusercontent.com/stedolan/jq/master/src/builtin.jq
  echo 'walk('
  for i in transactions spent_outpoints verified_tx3 txo txi addresses addr_history; do
    echo 'if type == "object" and has("'"$i"'") then del(.'"$i"') else . end |'
  done
  echo '.)'
)  ~/.electrum/testnet/wallets/default_wallet

答案 3 :(得分:0)

对于非常大的JSON文档,可能最好使用jq的“流解析器”来解决此类问题,至少在编辑操作大大减小文档大小的情况下。无论如何,这是一个使用--stream选项的解决方案:

jq --stream 'select(length == 2 and .[0][-1] == "maxHeight" | not)' new.json |
 jq -n 'fromstream(inputs)'

请注意,必须在第二次调用jq。

时使用-n选项

答案 4 :(得分:0)

我遇到了类似的问题,但是不想为此花费很多代码或花太多时间。

我假设您已解决此问题。但对我而言,以下内容为我提供了不必递归寻找的值,即仅在顶级级别。另外,我不在乎是否存在空白/空值:

$ awk ' { c=$2; if(c-p>10 && NR>1 ) { print a,p; print $0 } p=c;a=$1 } ' waheed.txt
g 40
h 55

$ cat waheed.txt
a 12
b 16
c 19
d 25
e 28
f 38
g 40
h 55
i 56
j 59
k 62

$