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
?@EtanReisnerecho“$var”
打印换行符(不令人震惊)declare-p var
产生typeset var='{“foo”:“foo\r\nbar”}'
,这当然更符合我的要求。@EtanReisner抱歉,我第一次在上面的注释中输入错误时运行了echo“$var”
,听起来好像输出中有文字换行字节,而不是转义字符。如果使用--trace
选项卷曲,您会在响应中看到什么?这也是zsh或bash,因为它们在这里略有不同(我认为您的测试输出似乎指示zsh)?@EtanReisnercurl--trace
输出:我使用的是zsh
(应该更清楚)。bash
中的一个解决方案也是完全可以接受的,因为我希望这个脚本可以指定解释器。双引号版本应该可以正常工作。如果运行var=$(curl资源),会得到什么结果;回声“$var”;declare-p var
?@EtanReisnerecho“$var”
打印换行符(不令人震惊)declare-p var
产生typeset var='{“foo”:“foo\r\nbar”}'
,这当然更符合我的要求。@EtanReisner抱歉,我第一次在上面的注释中输入错误时运行了echo“$var”
,听起来好像输出中有文字换行字节,而不是转义字符。如果使用--trace
选项进行旋度,您会在响应中看到什么?这也是zsh或bash,因为它们在这里略有不同(我认为您的测试输出似乎指示zsh)?@EtanReisnercurl--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")))'