使用jq从JSON提取多个片段,并全部输出到一行

时间:2018-10-17 12:54:37

标签: json bash jq

我的代码

#!/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 :(得分:3)

这里根本没有使用多个echo,并且当每个结果中都包含了所需的所有数据时,确定毫无意义地向API发出两个请求。 / p>

#!/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的{​​{1}}参数来告诉它输出“原始字符串”-这就是为什么这里不需要jq的原因。另外,由于tr在每个参数后面放置换行符,因此,每行所需的输出仅应运行echo。 (echo参数可以在某些版本中取消此操作,但是依靠它是不安全的;在不需要尾随换行符时,最好使用-n。)

printf '%s' ...类似地在每一行输出之后都写一个换行符(因为所有行为良好的UNIX程序都会发出文本流)。使用command substitution会删除这些尾随的换行符,因此我们不会将它们存储在jqsunrise变量中,因此不会在sunset中引入它们。