这个问题的延伸:jq:使用其他字段的约束解析 json 文件
选择字段后"name"
我想对其进行着色:
{
"checksum": "9e44bb7b76d8c39c45420dd2158a4521",
"roots": {
"bookmark_bar": {
"children": [ {
"children": [ {
"date_added": "13161269379464568",
"id": "2046",
"name": "The title is here",
"sync_transaction_version": "1",
"type": "url",
"url": "https://the_url_is_here"
}, {
经过谷歌一段时间并阅读了jq
的联机帮助页,似乎我们可以通过使用JQ_COLORS
default调用的变量来设置颜色JQ_COLORS=1;30:0;39:0;39:0;39:0;32:1;39:1;39
,我的环境中没有它,所以我手动设置(我不应该,因为它是默认的 - 硬编码在某处),并针对jq
命令进行测试,但输出没有颜色(输出只是一个字段,而不是 json 对象)。我猜想颜色jq
是针对 json 对象的,而不是所选字段的颜色。
所以我问有没有办法为选定的字段设置颜色jq
?
编辑:我坚持-r
或不-r
选择jq
:使用此命令:
jq -r '.roots.bookmark_bar.children[]|.children[]|["\"\(.name)\"",.url]|@tsv' json_file`
我预期的结果是:
"something here has spaces and inside a double quotes" solid_line_without_space
但如果我留下-r
选项,我有命令:
jq '.roots.bookmark_bar.children[]|.children[]|["\(.name)",.url]|@tsv' json_file`
结果如下 - 不是预期的,\t
无法扩展:
"something here has spaces and inside a double quotes"\tsolid_line_without_space
问题1:如何实现结果:
"something here has spaces and inside a double quotes" solid_line_without_space
没有-r
选择,我真的需要这里的颜色。
问题2:因为我在查询中过滤了两个字段,所以如何仅在字段上保留颜色"name"
而不在字段上保留颜色"url"
- 事实上它可以扩展到如何自定义每个字段的颜色(我猜我必须修改JQ_COLORS
)
问题3:扩展问题:如果我通过另一个过滤器进行管道传输,如何保持字段的颜色,例如:jq <..> | sed <...>
?
问题4: 如何定制分离器?这里我有@tsv
as sym for ,如果像-<tab>
这样的分隔符呢?|
space|space
答案1
我仍然不确定到底是什么问题。如果这是关于如何jq
对输出进行着色,请查看man jq
:
o --color-output / -C and --monochrome-output / -M:
By default, jq outputs colored JSON if writing to a terminal. You can force it to produce color even if
writing to a pipe or a file using -C, and disable color with -M.
因此,当写入管道时,您并不是写入终端,这就是没有颜色的原因。通过比较来测试一下
echo '{"foo":"bar"}' | jq .
echo '{"foo":"bar"}' | jq . | cat
您可以通过添加以下内容再次打开着色-C
:
echo '{"foo":"bar"}' | jq -C . | cat
如果您想做一些更困难的事情,例如模仿jq
JSON 值的颜色方式,但您不希望将其用于 JSON 字段名称,或者仅用于对象的某些部分,请更新您的问题。
请注意,着色仅包括向输出添加转义码。您可以通过多种方式模仿这一点。
答案2
从jq 文档:
要配置替代颜色,只需将
JQ_COLORS
环境变量设置为以冒号分隔的部分终端转义序列列表,例如"1;31"
,按以下顺序:
- 空值的颜色
- 假的颜色
- 真实颜色
- 数字的颜色
- 字符串的颜色
- 数组的颜色
- 物体的颜色
这些是您唯一可以更改的组件,并且列表中的每个条目都只有一个设置。您无法使用 挑选和选择单个成员JQ_COLORS
,因此所有字符串都将以相同的方式处理。
由于您的输出不再采用 JSON 格式,因此无需继续以jq
.您可以将其传递给另一个命令以添加正确的终端转义序列。参见例如。shell 脚本中的“友好”终端颜色名称?