我有一个功能,如:
getServers() {
curl -s -X GET ...
}
Run Code Online (Sandbox Code Playgroud)
输出是一个复杂的 JSON 字符串。我可以像这样解析 JSON:
serverId=$(getServers | jq -r ".[] | select(whatever...)")
echo $serverId
Run Code Online (Sandbox Code Playgroud)
但是如果我将函数调用的输出存储在一个变量中,我会收到一个错误:
servers=$(getServers)
echo $servers | jq .
# jq can not process this
# parse error: Invalid string: control characters from U+0000 through
echo "$servers" | jq .
# does not work either
Run Code Online (Sandbox Code Playgroud)
U+001F 必须在第 ...
即使我$servers包含与函数调用相同的值,也jq无法处理它。这里发生了什么事?
$ jq --version
jq-1.5
这不是一个重复的问题!这个问题的根源在于\r\n字符串中的存在。添加引号并不能解决问题。
将字符串通过管道输送到tr '\r\n' ' ':
servers=$(getServers)
echo $servers | tr '\r\n' ' ' | jq .
Run Code Online (Sandbox Code Playgroud)
此脚本及其输出显示添加如何"不解决问题,但tr可以:
#!/bin/env bash
get() {
x=$'multi\r\nline'
echo $x
}
g=$(get)
echo 'Without "'
echo $g
echo 'With "'
echo "$g"
echo 'With tr'
echo $g | tr '\r\n' '\n'
Run Code Online (Sandbox Code Playgroud)
输出:
Without "
line
With "
line
With tr
multi
line
Run Code Online (Sandbox Code Playgroud)
我希望社区投票重新打开这个问题。