不要在字符串的 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 不同)。
将此与 bash
和 ksh
(取决于基础 /bin/echo
实用程序的行为)进行对比,默认情况下 不 (在那里你需要使用非标准 -e
选项来打开这种扩展。
因此,要按原样打印字符串 ,可移植方法 是使用 printf '%s\n'
而不是 echo
,它保证反斜杠转义序列被视为 文字 :
printf '%s\n' "$(curl resource)"
作为仅适用于 zsh
和 bash
的替代方法,您可以使用
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")))'
我有点难以理解如何不 在字符串中插入转义字符...尤其是那些从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 不同)。
将此与 bash
和 ksh
(取决于基础 /bin/echo
实用程序的行为)进行对比,默认情况下 不 (在那里你需要使用非标准 -e
选项来打开这种扩展。
因此,要按原样打印字符串 ,可移植方法 是使用 printf '%s\n'
而不是 echo
,它保证反斜杠转义序列被视为 文字 :
printf '%s\n' "$(curl resource)"
作为仅适用于 zsh
和 bash
的替代方法,您可以使用
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")))'