如何为JQ中的每个元素修剪空白?

时间:2017-06-13 16:15:52

标签: unix trim jq

我有以下简单的JSON

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

我需要的是:

"http://url",null

v1v2之前没有空格)

我拥有的是:

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

如何摆脱k1和k2值的空间?

3 个答案:

答案 0 :(得分:5)

如果输入是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",

答案 1 :(得分:3)

下面将删除任意复杂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"}]

答案 2 :(得分:0)

您的示例是常规的,因为每个值都以不需要的空间开头。如果这真的具有代表性,那么范围切片的简单地图就可以了:

gsub

这种方法具有朴实无华和易于理解的优点。如果您的示例与现实不匹配 - 零个或多个空格,嵌套数组等 - 那么您需要使用uploadForm=driver.find_element_by_xpath('//*[@id="react-root"]/section/nav/div/div/form/input') driver.execute_script("arguments[0].style.height='auto'; arguments[0].style.visibility='visible';", uploadForm) #makes form visible submitForm = driver.find_element_by_xpath('//*[@id="react-root"]/section/nav/div/div/form') #selects whole form driver.execute_script("arguments[0].style.height='auto'; arguments[0].style.visibility='visible';", submitForm) #unhides form as well uploadForm.send_keys("/testman.JPG") #sends the file path to the input section of form submitForm.submit() #attempts to submit form, causing the refresh ,条件等部署更全面的方法。