如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?
Posted
技术标签:
【中文标题】如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?【英文标题】:How to remove double-quotes in jq output for parsing json files in bash? 【发布时间】:2022-01-10 22:57:37 【问题描述】:我正在使用 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脚本在一行文本中打开和关闭双引号
如何在bash脚本中传递变量的双引号值作为curl命令的参数?