无效字符串:必须使用 Bash 对从 U+0000 到 U+001F 的控制字符进行转义?

hpa*_*nia 27 bash shell jq

我有一个功能,如:

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)

我希望社区投票重新打开这个问题。