JQ中的每个元素如何trim白space?

How to trim white space for every element in JQ?

我有以下简单的JSON

json='[{"k1":" http://url", "k2":null, "k3":" v3", "k4":" v4"}]'

我需要的是:

"http://url",null

(在 v1v2 之前没有 space)

我有的是:

echo $json | jq -c '.[] | .k1, .k2 ' | paste -d "," - -

如何去除 k1 和 k2 值中的 space?

下面将删除任意复杂 JSON 结构中任意位置的字符串中的前导和尾随空格:

#!/usr/bin/env jq -cf

# Define walk function (standard library only for jq 1.6 and newer, currently unreleased)
def walk(f):
  . as $in
  | if type == "object" then
      reduce keys_unsorted[] as $key
        ( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
  elif type == "array" then map( walk(f) ) | f
  else f
  end;

walk(
  if type == "string" then
    (sub("^[[:space:]]+"; "") | sub("[[:space:]]+$"; ""))
  else . end
)

如果保存上述内容(例如在 trim-json 中),并将其标记为可执行文件 (chmod +x trim-json),则 ./trim-json <<<"$json" 会根据您给定的输入发出:

[{"k1":"v1","k2":"v2","k3":"v3","k4":"v4"}]

同样,更新后的输入:

$ json='[{"k1":" http://url", "k2":null, "k3":" v3", "k4":" v4"}]'
$ ./trim-json <<<"$json"
[{"k1":"http://url","k2":null,"k3":"v3","k4":"v4"}]

该示例在每个值前面都有一个 space。对于您可以简单地删除字符串的第一个(或 N 个)字符的情况,则范围切片上的简单映射有效:

$ jq -c '.[] | map_values(.[1:]) | .k1,.k2' <<< "$json" | paste -d "," - -
"http://url",null

这种方法的好处是朴实无华且易于理解。

如果输入是 JSON 个对象的数组,并且您正在寻找单行代码,那么以下内容似乎可以满足您的要求:

jq '.[]|(.k1,.k2)|if type=="string" then gsub("^\s+|\s+$";"") else . end' | paste -d "," - -

根据您的输入,这会产生

"http://url",null

如果您对 null 在输出中的呈现方式很灵活,您也可以考虑全 jq 解决方案(即没有 paste)。例如:

jq -r '.[]|[.k1,.k2]|map(if type=="string" then gsub("^\s+|\s+$";"") else . end)|@csv'

根据您的输入,结果为:

"http://url",