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

Chr*_*s F 99 bash awk sed jq

我使用JQ解析一个JSON文件,如这里.但是,字符串值的结果包含预期的"双引号",如下所示:

$ cat json.txt | jq '.name'
"Google"
Run Code Online (Sandbox Code Playgroud)

如何将此管道传输到另一个命令以删除""?所以我明白了

$ cat json.txt | jq '.name' | some_other_command
Google
Run Code Online (Sandbox Code Playgroud)

some_other_command可以用什么?

Cha*_*ffy 228

使用该-r选项发出原始字符串作为输出:

jq -r '.name' <json.txt
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,任何给定的极端情况是否可以安全地忽略,都需要进行明确的、具体情况具体分析的设计考虑。否则,你最终会进入我们生活的世界,那里的软件充满了错误,因为设计没有考虑可能输入的全部范围。这就是说——除非有人提出“作为一个要求”,“”永远不能作为文字数据而不是语法存在,否则假设这种情况是不负责任的。(我从事安全工作,看到很多问题被错误分类当他们确实未能针对完整输入域进行设计时,就会出现“输入验证”失败的情况) (27认同)
  • @hd1,只有在没有文字引号的情况下才是正确的。如果某人的名字是“Mack \”The Knife \” Smith”`,您希望将其更改为“Mack “The Knife” Smith”,而不是“Mack The Knife Smith”。 (14认同)
  • 如果您想去掉引号,只需将此命令的输出通过管道传输到`tr -d '"'`。 (6认同)
  • 如果我不想转义任何内容而只想删除引号怎么办? (5认同)
  • jq 需要一个文件名,因此不需要通过管道传输或重定向文件内容 `jq -r '.name' json.txt` 就可以正常工作 (4认同)
  • 听起来您已经足够详细地说明了您应该提出一个新问题的规格,以便可以完整地给出规格。这种来回确定您想要的内容(您的输入是什么,预期的输出是什么,jq和bash代码之间的边界位于何处等)的方法无济于事。 (3认同)

Hey*_*his 60

所以对于包含这样的文件{"name": "Google"}

sample='{"name":"Google"}'
echo $sample| jq '.name'

"Google"
Run Code Online (Sandbox Code Playgroud)

使用--raw-output帮助

echo $sample| jq --raw-output '.name'

Google
Run Code Online (Sandbox Code Playgroud)

但我偶然发现了这个问题,因为我正在使用--raw-output像这样的 json 数组

sample='[{"name":"Yahoo"},{"name":"Google"}]'
echo $sample | jq --raw-output 'map(.name)'

[
  "Yahoo",
  "Google"
]
Run Code Online (Sandbox Code Playgroud)

我不明白为什么引号仍然存在。我偶然发现了这篇文章,现在我知道添加| .[]可以解决问题!

echo $sample | jq --raw-output 'map(.name)| .[]'

Yahoo
Google
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“echo $sample”本身就有问题。请参阅[我刚刚分配了一个变量,但 `echo $variable` 显示了其他内容!](/sf/ask/2056499651/ some-else) -- 总是 `echo "$sample"`,带引号;或者,更好的是 `printf '%s\n' "$sample"` (2认同)