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
(在 v1
和 v2
之前没有 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",
我有以下简单的JSON
json='[{"k1":" http://url", "k2":null, "k3":" v3", "k4":" v4"}]'
我需要的是:
"http://url",null
(在 v1
和 v2
之前没有 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",