我试图使用将字符串格式化为JSON使用jq,并且我注意到bash上的不同行为;特别是当zsh直接运行jq时,结果与它在子subshell中运行时的结果不同:在第一种情况下,\n输入以\\n的形式输出,而在后一种情况下,以\n的形式获得输出。
我很困惑,也不知道那是怎么回事:
jq错误吗?顺便说一句:与jq一起使用换行符建议使用printf %b来获取\n,而不是\\n,后者适用于bash。但各模式之间的zsh差异仍然存在。
$ jq --version
jq-1.6
# ---
# Using \n directly
bash-3.2$ jq --null-input --compact-output --raw-output --monochrome-output --arg test 'A\nB' '{test: $test}'
{"test":"A\\nB"}
bash-3.2$ OUT=$(jq --null-input --compact-output --raw-output --monochrome-output --arg test 'A\nB' '{test: $test}'); echo $OUT
{"test":"A\\nB"}
zsh-5.8.1> jq --null-input --compact-output --raw-output --monochrome-output --arg test 'A\nB' '{test: $test}'
{"test":"A\\nB"}
zsh-5.8.1> OUT=$(jq --null-input --compact-output --raw-output --monochrome-output --arg test 'A\nB' '{test: $test}'); echo $OUT
{"test":"A\nB"}
# -----
# Using `printf %b` to convert `\n` to real newline
bash-3.2$ jq --null-input --compact-output --raw-output --monochrome-output --arg test "$(printf %b 'A\nB')" '{test: $test}'
{"test":"A\nB"}
bash-3.2$ OUT=$(jq --null-input --compact-output --raw-output --monochrome-output --arg test "$(printf %b 'A\nB')" '{test: $test}'); echo $OUT
{"test":"A\nB"}
zsh-5.8.1> jq --null-input --compact-output --raw-output --monochrome-output --arg test "$(printf %b 'A\nB')" '{test: $test}'
{"test":"A\nB"}
zsh-5.8.1> OUT=$(jq --null-input --compact-output --raw-output --monochrome-output --arg test "$(printf %b 'A\nB')" '{test: $test}'); echo $OUT
{"test":"A
B"}发布于 2022-09-29 16:58:22
printf行为在两个shell之间是相同的,所有与jq调用相关的shell扩展都是相同的--但是默认的echo行为不同。
您可以通过从echo切换到printf来避免这种情况。
% OUT=$(jq --null-input --compact-output --raw-output --monochrome-output --arg test "$(printf %b 'A\nB')" '{test: $test}')
% printf '%s\n' "$OUT"
{"test":"A\nB"}https://stackoverflow.com/questions/73899110
复制相似问题