jq:对 json 文件的选定字段进行着色

jq:对 json 文件的选定字段进行着色

这个问题的延伸: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_COLORSdefault调用的变量来设置颜色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: 如何定制分离器?这里我有@tsvas 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

如果您想做一些更困难的事情,例如模仿jqJSON 值的颜色方式,但您不希望将其用于 JSON 字段名称,或者仅用于对象的某些部分,请更新您的问题。

请注意,着色仅包括向输出添加转义码。您可以通过多种方式模仿这一点。

答案2

jq 文档:

要配置替代颜色,只需将JQ_COLORS环境变量设置为以冒号分隔的部分终端转义序列列表,例如"1;31",按以下顺序:

  • 空值的颜色
  • 假的颜色
  • 真实颜色
  • 数字的颜色
  • 字符串的颜色
  • 数组的颜色
  • 物体的颜色

这些是您唯一可以更改的组件,并且列表中的每个条目都只有一个设置。您无法使用 挑选和选择单个成员JQ_COLORS,因此所有字符串都将以相同的方式处理。

由于您的输出不再采用 JSON 格式,因此无需继续以jq.您可以将其传递给另一个命令以添加正确的终端转义序列。参见例如。shell 脚本中的“友好”终端颜色名称?

相关内容