我使用它jq作为解析大型嵌套json文件的有效方法。有时我想要jq一个json格式化文件,该文件在键和值周围有单引号而不是双引号,如下所示:
{
'aggs': {
'two': {
'composite': {
'size': 700
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这不被认为是实际json格式,但我想知道 jq 是否有一些我可以设置来读取此文件的参数,否则它无法读取此文件。
如果没有,linux中将所有单引号替换为双引号以便可以读取的最有效方法是什么jq
Kus*_*nda 10
对键或一般字符串使用单引号会破坏JSON 格式规范,但我们可以将文档解释为包含文字(单引号)字符串的 YAML 文档。
Mike Farahyq能够将其解析为 YAML(带有下面提到的注意事项),并将其转换为标准 JSON:
$ yq -oj eval . file
{
"aggs": {
"two": {
"composite": {
"size": 700
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,它会'1"2'正确转换为"1\"2",但它不会处理'1\'2'(它会给出错误,但这并不奇怪,因为该字符串在 YAML 中也是无效字符串)。由于反斜杠在单引号 YAML 字符串中是文字,这意味着它会转换'1\"2'为"1\\\"2".
由于反斜杠是文字反斜杠,因此它可能无法对包含其他已编码值的字符串执行您想要的操作,例如编码为的文字换行符\n或编码为的文字制表符\t,将它们分别转换为\\n和\\t。
Andrey Kislyuk 的yq(它是 的包装器jq)似乎与 Mike 的有相同的限制和警告yq:
$ yq . file
{
"aggs": {
"two": {
"composite": {
"size": 700
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Stephen Levine 的yj也可用于将数据从 YAML 转换为 JSON:
$ yj <file
{"aggs":{"two":{"composite":{"size":700}}}}
Run Code Online (Sandbox Code Playgroud)
如果在这些文件中,引号像 json 一样被转义(前置),那么您可以在将文档提供给以下内容之前\翻译引号:trjq
cat file_with_single_quotes | tr "'" '"' | jq ...
Run Code Online (Sandbox Code Playgroud)
或者更简单的:
tr "'" '"' < file_with_single_quotes | jq ...
Run Code Online (Sandbox Code Playgroud)
对于您问题中的文字:
$ tr "'" '"' < file_sq | jq .aggs.two
{
"composite": {
"size": 700
}
}
Run Code Online (Sandbox Code Playgroud)