不要在字符串的 curl 响应中插入换行符

Do not interpolate newline characters in curl response in strings

我有点难以理解如何 在字符串中插入转义字符...尤其是那些从curl 响应返回的字符。我正在获取如下所示的数据:

{"foo":"bar\r\nbaz"}

就其本身而言,curl resource 将打印出上述内容没有问题。但是,如果我使用 echo $(curl resource) 中的命令替换,它将发出:

{"foo":"bar
baz"}

我正在尝试使用节点来解析 JSON,如:

node -e "console.log(JSON.parse('$(curl resource)'))"

但是它也会阻塞内插的换行符,因为它们在 JSON.

中无效

我试过:

node -e $'console.log(JSON.parse(\'$(curl resource)\'))'
# Shell syntax error on the second `$`
node -e $'console.log(JSON.parse(\''$(curl resource)$'\'))'
# Fails to parse JSON due to newline

如何防止命令替换插入转义字符。


至于echo问题:

echo in zsh 默认 是否 扩展反斜杠转义序列 例如\n ,这是 POSIX 规定的(但请注意,zsh 通常与 POSIX 不同)。

将此与 bashksh(取决于基础 /bin/echo 实用程序的行为)进行对比,默认情况下 (在那里你需要使用非标准 -e 选项来打开这种扩展。

因此,要按原样打印字符串 可移植方法 是使用 printf '%s\n'而不是 echo,它保证反斜杠转义序列被视为 文字 :

printf '%s\n' "$(curl resource)"

作为仅适用于 zshbash 的替代方法,您可以使用

echo -E "$(curl resource)"

至于node -e问题:

您必须转义 curl 输出中的 \ 实例,以防止它们被 node 解释为反斜杠转义序列:

node -e "console.log(JSON.parse('$(curl resource | sed 's/\/\\/g')'))"     

如果您想避免转义,请通过 stdin:

传递 curl 命令的输出
curl resource | 
  node -e 'console.log(JSON.parse(require("fs").readFileSync("/dev/stdin", "utf-8")))'