如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?

Posted

技术标签:

【中文标题】如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?【英文标题】:How to remove double-quotes in jq output for parsing json files in bash? 【发布时间】:2017-11-23 04:50:34 【问题描述】:

我正在使用 jq 解析 JSON 文件,如 here 所示。但是,字符串值的结果包含预期的“双引号”,如下所示:

$ cat json.txt | jq '.name'
"Google"

如何将其通过管道传递到另一个命令中以删除“”?所以我得到了

$ cat json.txt | jq '.name' | some_other_command
Google

我可以使用什么some_other_command

【问题讨论】:

仅供参考,cat foo | bar 的效率明显低于bar <foo 或其等效的<foo bar尤其是如果bar 是像sort 这样可以并行化的程序当给定一个可查找的文件描述符而不是 FIFO(只能从前到后读取一次)时,它的操作。这既意味着更多的启动开销(调用/bin/cat),也意味着更多的用户空间和内核之间的上下文切换(每条内容通过cat 中的read(),然后通过write()cat 中的FIFO,然后在目标程序中添加read(),而不是直接跳到最后一步)。 另一个差别很大的例子是cat foo | wc -c,与wc -c <foo——在后一种情况下,它只能执行两个系统调用,seek()tell(),现在获取文件的确切大小,不管它有多长;在前者中,它需要读取到最后,即使是千兆字节的内容,因为只有cat 可以直接访问原始文件,而wc 无法请求其上的元数据。 【参考方案1】:

使用-r(或--raw-output)选项发出原始字符串作为输出:

jq -r '.name' <json.txt

【讨论】:

如果我不想取消任何转义而只想去掉引号怎么办? 听起来你有足够详细的规范,你应该问一个新问题,以便可以完整地给出规范。这种来回确定你想要什么的方法(你的输入是什么,你的预期输出是什么,你的 jq 和 bash 代码之间的边界在哪里等等)是没有帮助的。 如果您想在保留在 jq 中的同时去掉引号,这将您的问题与 OP 区分开来,后者想要一个不带引号的字符串 in bash。再一次,我在这里完成,直到/除非你链接到一个新问题。 如果你想去掉引号,只需将此命令的输出通过管道传输到tr -d '"' 作为规则,任何给定的极端情况是否可以安全忽略需要明确的逐案设计考虑。否则你最终会进入我们生活的世界,因为设计没有考虑可能输入的全部范围,软件充满了错误。也就是说——除非有人提出作为要求" 永远不能作为文字数据而不是语法存在,否则假设是这种情况是不负责任的。 (我从事安全工作,看到很多问题被错误归类为“输入验证”失败,而实际上它们确实未能针对完整输入域进行设计)

以上是关于如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除多余的双引号,而不是使用bash脚本在一行文本中打开和关闭双引号

如何有条件地删除 R 中 write.csv 中的双引号

Bash——反引号内的双引号

如何在bash脚本中传递变量的双引号值作为curl命令的参数?

为啥 jq --raw-output 参数无法从 @csv 输出中删除引号?

如何在php中删除从json “x”:“y”到x:y的双引号[关闭]