jq使用with_entries修改哈希值时if-then-else逻辑不生效如何解决
问题根因
你代码的核心问题是jq中带?后缀的属性访问、以及strings/numbers这类类型过滤器,在匹配失败时返回的是**空输出(empty)**而非false或null。此时if表达式会因为条件分支没有有效输入直接中断执行,不会走到else分支返回原值,最终赋值时就会得到null。
解决方案
方法1:先判断类型再操作(推荐)
优先用type内置函数判断值的类型,再执行对应逻辑,避免匹配失败产生空输出。
针对你提取对象.v属性的需求,正确写法如下:
jq -n ' {a:"string",b:{k:"k",v:1},c:12} | with_entries(.value |= if type == "object" and has("v") then .v else . end) '
执行输出:
{ "a": "string", "b": 1, "c": 12 }
你第二个判断字符串的场景同理,把条件改成type == "string"即可:
jq -n ' {a:"string",b:{k:"k",v:1},c:12} | with_entries(.value |= if type == "string" then . else . end) '
方法2:用//运算符转换空输出
如果不想判断类型,可以用//运算符把空输出/null转换为指定的默认值,让if条件可以正常走到else分支:
jq -n ' {a:"string",b:{k:"k",v:1},c:12} | with_entries(.value |= if (.v? // null) != null then .v else . end) '
注意:该方法如果对象的.v属性本身存储的就是null,会被误判为不存在,适合确定.v有效值非null的场景。
内容的提问来源于stack exchange,提问作者ericslaw
相关产品推荐
相关产品推荐

