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

Json 不要在字符串中的curl响应中插入换行符,json,bash,zsh,Json,Bash,Zsh,我很难理解如何在字符串中不插入转义字符。。。特别是那些从curl响应返回的。我正在获取的数据如下所示: {"foo":"bar\r\nbaz"} 单独,curl资源将打印出上面的内容,没有问题。但是,如果我像在echo$(curl资源)中那样使用命令替换,它将发出: {"foo":"bar baz"} 我正在尝试使用node解析JSON,如下所示: node -e "console.log(JSON.parse('$(curl resource)'))" 但是,它也会阻塞插入的换行符,因为

我很难理解如何在字符串中不插入转义字符。。。特别是那些从
curl
响应返回的。我正在获取的数据如下所示:

{"foo":"bar\r\nbaz"}
单独,
curl资源
将打印出上面的内容,没有问题。但是,如果我像在
echo$(curl资源)
中那样使用命令替换,它将发出:

{"foo":"bar
baz"}
我正在尝试使用node解析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
问题:

zsh
中的
echo
默认情况下会扩展反斜杠转义序列,如POSIX规定的
\n
(但请注意,
zsh
通常会偏离POSIX)

将此与
bash
ksh
(取决于底层
/bin/echo
实用程序的行为)进行对比,默认情况下,这两个实用程序不支持(在这里,您需要使用非标准
-e
选项来启用此类扩展)

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

作为仅在
zsh
bash
中工作的替代方案,您可以使用

echo -E "$(curl resource)"

关于
节点-e
问题:

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

如果要避免转义,请通过stdin传递
curl
命令的输出:


至于
echo
问题:

zsh
中的
echo
默认情况下会扩展反斜杠转义序列,如POSIX规定的
\n
(但请注意,
zsh
通常会偏离POSIX)

将此与
bash
ksh
(取决于底层
/bin/echo
实用程序的行为)进行对比,默认情况下,这两个实用程序不支持(在这里,您需要使用非标准
-e
选项来启用此类扩展)

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

作为仅在
zsh
bash
中工作的替代方案,您可以使用

echo -E "$(curl resource)"

关于
节点-e
问题:

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

如果要避免转义,请通过stdin传递
curl
命令的输出:


双引号版本应该可以正常工作。如果运行
var=$(curl资源),会得到什么结果;回声“$var”;declare-p var
?@EtanReisner
echo“$var”
打印换行符(不令人震惊)
declare-p var
产生
typeset var='{“foo”:“foo\r\nbar”}'
,这当然更符合我的要求。@EtanReisner抱歉,我第一次在上面的注释中输入错误时运行了
echo“$var”
,听起来好像输出中有文字换行字节,而不是转义字符。如果使用
--trace
选项卷曲,您会在响应中看到什么?这也是zsh或bash,因为它们在这里略有不同(我认为您的测试输出似乎指示zsh)?@EtanReisner
curl--trace
输出:我使用的是
zsh
(应该更清楚)。
bash
中的一个解决方案也是完全可以接受的,因为我希望这个脚本可以指定解释器。双引号版本应该可以正常工作。如果运行
var=$(curl资源),会得到什么结果;回声“$var”;declare-p var
?@EtanReisner
echo“$var”
打印换行符(不令人震惊)
declare-p var
产生
typeset var='{“foo”:“foo\r\nbar”}'
,这当然更符合我的要求。@EtanReisner抱歉,我第一次在上面的注释中输入错误时运行了
echo“$var”
,听起来好像输出中有文字换行字节,而不是转义字符。如果使用
--trace
选项进行旋度,您会在响应中看到什么?这也是zsh或bash,因为它们在这里略有不同(我认为您的测试输出似乎指示zsh)?@EtanReisner
curl--trace
输出:我使用的是
zsh
(应该更清楚)。
bash
中的一个解决方案也是完全可以接受的,因为我希望这个脚本可以指定解释器。特别是节点解释器对转义序列的解释是个问题。我希望有另一种设置,而不是以这种方式使用
sed
,但这是一个足够好的解决方案。@ExplosionPills:很高兴听到它;我刚刚添加了一个基于stdin的解决方案,它绕过了转义的需要,特别是节点解释器对转义序列的解释是个问题。我希望有另一种设置,而不是以这种方式使用
sed
,但这是一个足够好的解决方案。@ExplosionPills:很高兴听到它;我刚刚添加了一个基于stdin的解决方案,它绕过了转义的需要。
node -e "console.log(JSON.parse('$(curl resource | sed 's/\\/\\\\/g')'))"     
curl resource | 
  node -e 'console.log(JSON.parse(require("fs").readFileSync("/dev/stdin", "utf-8")))'