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"
            }, {

しばらくインターネット検索をしてマンページを読んでみると、default という変数を使って色を設定jqできるようですが、私の環境にはなく手動で設定しました(デフォルト値なのでそうしないでください - どこかにハードコーディングされている)コマンドについてテストしましたが、出力に色がありません(出力はjsonオブジェクトではなくフィールドにすぎません)。色は、選択したフィールドの色ではなく、jsonオブジェクトの色のようです。JQ_COLORSJQ_COLORS=1;30:0;39:0;39:0;39:0;32:1;39:1;39jqjq

それで、選択したフィールドに色を設定する方法があるかどうか尋ねました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:クエリは2つのフィールドをフィルタリングしているので、"name"フィールドのみに色を維持し、フィールドに色を維持するにはどうすればよいですか"url"?実際、各フィールドの色をカスタマイズする方法まで拡張できます。修正するにはJQ_COLORS

質問3:拡張質問:次のように他のフィルタを介してパイプする場合は、フィールドの色をどのように維持しますかjq <..> | sed <...>

質問4: 区切り文字をカスタマイズする方法は?ここに@tsvの記号があります。<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

JSON値の色を模倣するなど、もう少し難しい作業をしたいのですが、jqJSONフィールド名やオブジェクトの特定の部分にのみ使用したくない場合は、質問を更新してください。

色付けは、出力にエスケープコードを追加するだけで構成されます。さまざまな方法でこれをまねることができます。

答え2

~からJQドキュメント:

代替色を設定するには、JQ_COLORS環境変数をコロンで区切られた部分的な端末エスケープシーケンスのリスト(たとえば"1;31"、次の順序)に設定するだけです。

  • NULL値の色
  • 偽の色
  • トゥルーカラー
  • 数字の色
  • 文字列の色
  • 配列の色
  • オブジェクトの色

これは変更可能な唯一のコンポーネントであり、リスト内の各項目には1つの設定しかありません。個々のメンバーの選択と選択は使用できないため、JQ_COLORSすべての文字列が同じ方法で処理されます。

出力はJSON形式ではなくなったため、続行する必要はありませんjq。これを別のコマンドに渡して、正しい端末エスケープシーケンスを追加できます。たとえば、参照してください。シェルスクリプトに「おなじみの」ターミナルカラー名がありますか?

関連情報