jq - bash 和 zsh 以及 zsh-subshel​​l 之间换行处理的差异

2024-04-22

我试图将字符串格式化为 JSON https://gist.github.com/jakub-g/b2ef123f8b754bc5c63bc854e7019987 using jq我注意到 bash 与 zsh 的行为不同;特别是当 zsh 运行时jq直接,结果与在子 shell 中运行时不同:\n输入得到输出为\\n在第一种情况下,与\n在后者中。

我很困惑,不确定那里发生了什么:

  • 这是已知的 zsh 行为吗?
  • 这是一个jq bug?
  • 或者它是否按设计工作,而我错过了一些东西?

BTW: 将换行符与 jq 一起使用 https://stackoverflow.com/questions/67391180/use-newline-with-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"}

printf两个 shell 之间的行为是相同的,所有与您的 shell 相关的 shell 扩展也是如此jq调用——但默认echo行为不同。

您可以通过切换来避免这种情况echo to 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"}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jq - bash 和 zsh 以及 zsh-subshel​​l 之间换行处理的差异 的相关文章

  • 如何覆盖现有的 zsh 键盘补全?

    我想让 zsh 能够自动完成 yast2 一个 OpenSuSE 控制面板 的模块 但它似乎已经定义了一些东西 我可以跑 compctl k hello world nonexistantprogram 很好 但是 compctl k he
  • zsh 别名 -> 函数?

    假设我有 alias gg git grep 然后是这样的东西 gg int x 有效 但是 gg int x 收到投诉 有没有办法将 gg 重写为 zsh 中的函数 以便它获取 gg 之后的所有参数 并将它们填充到字符串中 Thanks
  • 如何从 ZSH 的历史记录中删除条目

    假设我使用 zsh 运行了一个命令 echo mysecret gt file 我可以使用命令轻松打印历史记录 包括条目号fc l 1 echo mysecret gt file 但是如何轻松地从历史记录中删除条目呢 我找不到相应的段落男人
  • 如何在大 JSON 中删除大量对象并保留少量对象

    如何在大 JSON 文件中删除大量对象并保留少量对象 在这里 我有以下 JSON 文件 service category managed object resource object action locate options max VA
  • 卸载 oh-my-zsh 时遇到问题?

    我在 OSX 上 想要切换回原来的 zsh 配置哦我的zsh http github com robbyrussell oh my zsh 但是当我运行uninstall脚本它给了我一个错误 sudo uninstall oh my zsh
  • 如何通过 jq 的“join”函数使用换行符 (\n) 和制表符 (\t) 等非显示字符

    我在互联网上找不到这个 所以我想将其添加为文档 我想在非显示字符周围加入一个 json 数组 30 RecordSeparator 这样我就可以在 bash 中安全地迭代它 但我不太清楚该怎么做 我试过echo one two three
  • 如何让 jq 将参数视为数字而不是字符串?

    怎么做jq将输入参数视为数字而不是字符串 在下面的示例中 CURR INDEX是一个 Bash 变量 它具有我想要提取的数组索引值 jq arg ARG1 CURR INDEX ARG1 patchSets inputfile json 我
  • 使用 jq 分配多个输出变量

    我正在尝试使用jq解析来自的信息TVDB api https api thetvdb com swagger 我需要提取几个字段并将值分配给我可以继续在我的应用程序中使用的变量bash脚本 我知道我可以通过 bash 轻松地将输出分配给一个
  • 无法在 Zsh 中使用颜色;文字有效,但没有出现颜色

    我刚买了一台 Mac 我正在尝试用颜色自定义我的 Zsh 提示符 但我无法让颜色起作用 我不确定是因为 LS COLORS 还是什么原因 这是我的 zshrc export CLICOLOR 1 export LSCOLORS ExFxBx
  • 通过 bash 过滤 json - 不区分大小写

    我有 json 代码 需要通过属性的值对其进行过滤DNSName 过滤器必须不区分大小写 我怎样才能做到这一点 有没有可能解决它jq 这就是我创建 json 代码的方式 aws elbv2 describe load balancers r
  • JQ:如何将被识别为字符串的值相乘?

    我正在尝试从交换网络套接字获取一些贸易信息 在我从套接字获取的 JSON 中 值 p 和 q 都用双引号括起来 当我尝试将两个值相乘时 它表示我正在尝试将两个字符串相乘 因此 我通过 tonumber 过滤器传递这些字符串 并且错误消息发生
  • VSCode 终端任务不使用 zsh 配置文件

    我正在尝试在 VSCode 中的窗口加载上运行任务 其中终端打开并且nvm use yarn dev默认运行 但是 运行此 shell 任务似乎不会加载我的 zsh 配置文件 我运行任务得到的输出是 The terminal process
  • jq - bash 和 zsh 以及 zsh-subshel​​l 之间换行处理的差异

    我试图将字符串格式化为 JSON https gist github com jakub g b2ef123f8b754bc5c63bc854e7019987 using jq我注意到 bash 与 zsh 的行为不同 特别是当 zsh 运
  • jq:错误:无法迭代字符串

    有人可以解释一下下面的警告吗 输入文件是 env DC hosts apt update last success 1495991703 architecture amd64 hostname h1 apt update last succ
  • 切换到 zsh 会破坏命令行中的轨道

    我最近刚刚转而使用 zsh 和 oh my zsh 但在使用 Rails 命令行工具时遇到了问题 以下是我执行的步骤以及收到的错误 我运行了github页面提供的curl命令 curl L https github com robbyrus
  • 无法在 Zsh 中找到 Bash 的替代命令

    我将最新的 git completion bash 放入我的 zshrc 中 然后我得到 Users Masi bin shells git git completion bash 2116 command not found comple
  • 如何使用jq提取json值子字符串

    我有这个 json temperature 21 humidity 12 3 message Today ID 342 is running 我想使用jq来获取这个json temp 21 hum 12 3 id 342 正如你所看到的 我
  • bash、zsh :声明 [*] (天哪)

    我正在使用具有以下语法的 bash 脚本 declare a THIS 这在 zsh 中似乎是非法的 我收到 未找到匹配项 THIS 错误 谁能帮我把它翻译成 zsh 吗 另外 什么是 语法是什么意思 我知道我们正在声明一个数组 但为什么要
  • 读取原始输入行并输出单个数组

    我有一个目录 其中包含文件 我想从该文件列表创建一个数组 我以为这会很容易 比如 ls mydir jq R file1 file2 file3 我唯一能弄清楚的是 ls mydir jq sR split n select length
  • 如何保留一级对象并仅提取其子密钥之一?

    我正在使用 terraform state json 输出 并想对其进行一些转换 鉴于 terraform 发出的输入 cost sensitive false value 123 test id sensitive false value

随机推荐