curl
возвращает последовательность строк с CR / LF-символами, причем последняя строка (после пустой строки) является фактическим телом.Вы можете написать блок кода, который сначала использует цикл while
для анализа заголовков из стандартного ввода, завершается после завершения блока заголовка, а затем использует jq
для чтения остальной части ввода.Например:
# Consume standard input up to, and including, an empty line.
# Sets global variable 'etag'.
parse_headers () {
local header etag_regex='ETag: (.*)'
while read -d $'\r\n' header; do
if [[ $header =~ $etag_regex ]]; then
etag=${BASH_REMATCH[1]}
elif [[ -z $header ]]; then
# End of headers
break
fi
done
}
# Pass input first to parse_headers, then to jq
{
parse_headers
jq '._links.self' # After parse_headers is done, only the JSON should remain
} < <(curl ...)
echo "ETag is $etag"
Пример вывода
{
"href": "https://ci.example.com/go/api/admin/pipelines/my_pipeline"
}
ETag is "e064ca0fe5d8a39602e19666454b8d77"