Извлечение нескольких фрагментов из JSON с помощью jq с выводом всего в одну строку - PullRequest
0 голосов
/ 17 октября 2018

мой код

#!/bin/bash
echo "Sunrise is expected at"
curl -X GET 'https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400' | jq '.results.sunrise' | tr -d '"'
echo "and sunset at" 
 curl -X GET 'https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400' | jq '.results.sunset' | tr -d '"'
echo "."

Я хочу напечатать:

Sunrise is expected at 5:12:13 AM and sunset at 6:26:23 PM.

но у меня есть это:

Sunrise is expected at
5:12:13
AM and sunset at
6:26:23 PM

1 Ответ

0 голосов
/ 17 октября 2018

Нет никакого смысла использовать здесь несколько echo, а определенно нет смысла делать два запроса к API, когда все необходимые данные включены в каждый результат.

#!/usr/bin/env bash
curl -X GET 'https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400' | \
  jq -r '.results | "Sunrise is expected at \(.sunrise) and sunset is expected at \(.sunset)"

Если у вас есть более сложный подход, который не идеален, он все равно помогает использовать больше переменных:

#!/usr/bin/env bash
api_output=$(curl -X GET 'https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400') || exit
sunrise=$(jq -r '.results.sunrise' <<<"$api_output")
sunset=$(jq -r '.results.sunset' <<<"$api_output")
echo "Sunrise is expected at $sunrise and sunset at $sunset."

Обратите внимание на использование аргумента -r для jqсказать ему выводить «необработанные строки» - вот почему tr здесь не нужен.Кроме того, поскольку echo ставит новую строку после каждого аргумента, вы должны запускать echo только один раз для каждой требуемой строки вывода.(Аргумент -n может подавлять это в некоторых версиях, но на него небезопасно полагаться; лучше использовать printf '%s' ..., когда завершающие символы новой строки нежелательны).

jq аналогично записывает новую строку после каждой строкивывода (как и все хорошо работающие программы UNIX, испускающие текстовые потоки).Использование подстановки команд удаляет эти завершающие символы новой строки, поэтому мы не храним их внутри переменных sunrise и sunset и, таким образом, повторно вводим их в echo.

...