Json JQ-如何从键中删除引号
我使用JQ来呈现一些JSON。一切都很好,但是我需要的是不带引号的输出。尝试使用原始选项,但这毫无帮助 剧本:Json JQ-如何从键中删除引号,json,bash,shell,parsing,jq,Json,Bash,Shell,Parsing,Jq,我使用JQ来呈现一些JSON。一切都很好,但是我需要的是不带引号的输出。尝试使用原始选项,但这毫无帮助 剧本: jq--原始输出--arg ID“$ID”[.articles[]|{… 输出: [ { "id": "20191022203822", "title": "How tech companies measure “legal”", 我需要的是: [ { id: "20191022203822", title: "How tech compani
jq--原始输出--arg ID“$ID”[.articles[]|{…
输出:
[
{
"id": "20191022203822",
"title": "How tech companies measure “legal”",
我需要的是:
[
{
id: "20191022203822",
title: "How tech companies measure “legal”",
有人能帮忙吗?根据OP的要求,在回答中添加我的评论:
每个符合JSON的实用程序都会按照JSON语法输出一个完整的JSON,而您需要一个非JSON输出。我想您最好的选择是通过
sed
运行它,在这里您从标签中删除引号(但这种方法容易出现误报):
(注意,我将
+
正则表达式量词改为*
,以便在空标签和零缩进上普遍匹配)根据OP的要求,在答案中添加我的注释:
每个符合JSON的实用程序都会按照JSON语法输出一个完整的JSON,而您需要一个非JSON输出。我想您最好的选择是通过
sed
运行它,在这里您从标签中删除引号(但这种方法容易出现误报):
(注意,我将
+
正则表达式量词改为*
,以便在空标签和零缩进上进行普遍匹配)jq是图灵完成的,所以问题在于让jq生成非JSON输出有多容易
在本例中,可以从递归定义开始:
def printObject(offset):
(offset * " " // "") as $offset
| reduce to_entries[] as $kv ("";
($kv.value
| if type == "string" then "\"\(.)\""
elif type == "object" then printObject(offset+2)
else . end) as $v
| . + $offset + " \($kv.key): \($v)\n")
| "{\n" + . + $offset + "}";
根据这个定义,
{a:1, b:"etc", c: {d: [1,2,3]} } | printObject(0)
产生:
{
a: 1,
b: "etc",
c: {
d: [1,2,3]
}
}
jq是图灵完全的,所以问题在于让jq生成非JSON输出有多容易 在本例中,可以从递归定义开始:
def printObject(offset):
(offset * " " // "") as $offset
| reduce to_entries[] as $kv ("";
($kv.value
| if type == "string" then "\"\(.)\""
elif type == "object" then printObject(offset+2)
else . end) as $v
| . + $offset + " \($kv.key): \($v)\n")
| "{\n" + . + $offset + "}";
根据这个定义,
{a:1, b:"etc", c: {d: [1,2,3]} } | printObject(0)
产生:
{
a: 1,
b: "etc",
c: {
d: [1,2,3]
}
}
基于@Dmitry的回答,由于特殊字符仍然需要在键中引用,我发现调整以添加一些特殊字符会有所帮助:
jq ... | sed -E 's/(^ *)"([^".:-]*)":/\1\2:/'
基于@Dmitry的回答,由于特殊字符仍然需要在键中引用,我发现调整以添加一些特殊字符会有所帮助:
jq ... | sed -E 's/(^ *)"([^".:-]*)":/\1\2:/'
这不是有效的json。我担心除了将json加载到一种可以自己解析并以任何格式输出的语言之外,别无选择。有些人可以将其读取为字符串,而不是名称/键。每个符合json的实用程序都会按照json语法输出整个json,而您想要的是非json输出。我想您最好的选择是to在
sed
中运行它,从标签中删除引号(但这种方法容易出现误报),例如:jq…| sed-E的/(^+)([^”]+)"://\1\2://'
@Dmitry Dude,你成功了,请添加is作为答案。一些程序,如mongo集合配置或某些javascript字典格式,接受键缺少引号的类似json的对象。如果有人想知道为什么我们需要一种简单的方法来生成不符合要求的类似json的对象。这是无效的json。我担心除了将json加载到一种可以自己解析并以任何格式输出的语言之外,别无选择。有些人可以将其读取为字符串,而不是名称/键。每个符合json的实用程序都会按照json语法输出整个json,而您需要的是非json输出。我想最好的办法是运行它sed
从标签中删除引号(但这种方法容易出现误报),例如:jq…| sed-E的/(^+)([^”]+)"://\1\2://'
@Dmitry Dude,你让我开心了,请添加is作为答案。一些程序,如mongo集合配置或某些javascript字典格式,接受键缺少引号的类似json的对象。如果有人想知道为什么我们需要一种简单的方法来生成不兼容的类似json的对象。我很好奇,是不是jq处理递归调用?您的代码段仅限于平面对象,嵌套对象如何?非常令人印象深刻!:)我很好奇,jq处理递归调用吗?您的代码段仅限于平面对象,嵌套对象如何?非常令人印象深刻!:)