Замените \ n пробелом в выводе запроса / команды jq без команд tr и sed - PullRequest
0 голосов
/ 04 августа 2020

Ниже приведен мой входной файл, скажем, input. json

{
  "server1": {
    "name": "server1",
    "property": "ENABLED"
  },
  "server2": {
    "name": "server2",
    "property": "ENABLED"
  },
  "server3": {
    "name": "server3",
    "property": "ENABLED"
  },
  "server4": {
    "name": "server4",
    "property": "ENABLED"
  },
  "server5": {
    "name": "server5",
    "property": "ENABLED"
  },
  "server6": {
    "name": "server6",
    "property": "ENABLED"
  }
}

Я выполняю следующий запрос jq:

jq -r '.[] | select(.property == "ENABLED") |.name' input.json

Я получаю следующий результат:

server1
server2
server3
server4
server5
server6

Я хочу, чтобы в моем выводе не было новой строки и, как показано ниже, через пробел и без пробела после последнего слова (в данном случае server6)

server1 server2 server3 server4 server5 server6

Я не хотите сделать pipe после команды jq и получить результат с помощью команд sed и tr. Я хочу добиться этого только с помощью команды jq. Был бы признателен за помощь. спасибо.

1 Ответ

3 голосов
/ 04 августа 2020

Вы очень близко к этому! В вашем случае может помочь функция join:

jq -r '[.[]|select(.property=="ENABLED")|.name]|join(" ")' input.json

Обернув все имена в массив, функция join работает так же, как в python. Из do c:

join (str)

Объединяет массив элементов, заданных как входные, используя аргумент в качестве разделителя. Это противоположность split: то есть выполнение split ("foo") | join ("foo") над любой входной строкой возвращает указанную входную строку.

jq ´join(", ")´
   ["a","b,c,d","e"]
=> "a, b,c,d, e"
...