ハイライトモードを使用したカラーグレップ出力

ハイライトモードを使用したカラーグレップ出力

次のスクリプトがありますfind-file

find . -type f -iname "*$1*" -printf '%P\n' \
| GREP_COLORS="sl=0;33;49:ms=1;34;49" grep --color=always '^\|[^/]*$' \
| grep -i --color=auto "$1"

それがすることは:

  • パス部分の色分け
  • 基本名セクションのパターンの色を指定します。

ここに画像の説明を入力してください。

問題:パターン化後に色がリセットされます。

デフォルト名部分の場合は、完全に白色にすることができます。これはトリックを行います(変更する方法が見つかりませんでしたが)。

パス部分の場合、上記のスクリーンショットに示すように、まだ問題があります。色がリセットされ、ファイルパスが実際に終わる場所を見ることができなくなりました!

これには回避策がありますか?

編集する -3つの回避策があります!以下の提案はすべて有効で少し異なりますが、質問に対する回答です。パターンのすべての発生を強調するオプションを選択しましたが、ほぼ連続でしたが、率直に言ってほぼ同じで、選択が困難でした...

編集する -これを改善したい。分析前に照会結果はブロックされません。つまり、出力がフラッシュされ、1行ずつ処理されます。可能ですか?

答え1

たぶんこんなことはありませんか?

ここに画像の説明を入力してください。

注文する:

pattern='oRg'; find . -type f -iname "*$pattern*" -printf '%P\n' \
| GREP_COLORS="sl=0;33:mt=1;34" grep --color=always '[^/]*$' \
| GREP_COLORS="sl=1;34" grep --color=always -iP "$pattern(?=[^/]*$)" \
| GREP_COLORS="sl=0;33" grep -i "$pattern" --color

強調表示したくない場合は、最後の行を削除してください。模様部分dirname

grepの環境変数を確認してください。GREP_COLORSセクションを参照してください。

答え2

zsh組み込みグローバル演算子を使用してこれを実行できます。これにはいくつかの利点があります。

  • この問題を簡単に解決してください。
  • 改行文字を含むパス名を使用してください。
  • 基本名のパターンのみを強調表示しやすいです。
  • ワイルドカードの使用(方法によってパターンを異なるように解釈findgrep
  • ソートされたリストを提供します
  • GNU以外のシステムでも動作します(-printf-inameおよび--colorすべて非標準拡張です)。

たぶん、次のようなものがあります。

#! /bin/zsh -
pattern="(#i)${1?Please specify a pattern}"

set -o extendedglob

typeset -A find_file_color
find_file_color=(
  dirname  $'\e[0;33;49m'
  basename $'\e[1;34;49m'
  match    $'\e[1;33;44m'
  reset    $'\e[m'
)

colorize_file() {
  local file=${1-$REPLY}
  case $file in
    (*/*)
      REPLY=$find_file_color[dirname]$file:h$find_file_color[reset]/;;
    (*)
      REPLY=
  esac
  REPLY+=$find_file_color[basename]${${file:t}//(#m)$~pattern/$find_file_color[match]$MATCH$find_file_color[basename]}$find_file_color[reset]
}

print -rC1 -- **/*$~pattern*(ND.+colorize_file)

print完全なリストを作成して印刷する前にソートします。したがって、すべてのファイルを見つけた後にのみ、いくつかの出力が開始されます。見つかったとおりに印刷するには(ただし、ソートを放棄する必要があります)、glob修飾子関数を使用してカラーファイルを印刷できます。

#! /bin/zsh -
pattern="(#i)${1?Please specify a pattern}"

set -o extendedglob

typeset -A find_file_color
find_file_color=(
  dirname  $'\e[0;33;49m'
  basename $'\e[1;34;49m'
  match    $'\e[1;33;44m'
  reset    $'\e[m'
)

colorize_file() {
  local file=${1-$REPLY}
  case $file in
    (*/*)
      REPLY=$find_file_color[dirname]$file:h$find_file_color[reset]/;;
    (*)
      REPLY=
  esac
  REPLY+=$find_file_color[basename]${${file:t}//(#m)$~pattern/$find_file_color[match]$MATCH$find_file_color[basename]}$find_file_color[reset]
  print -r -- $REPLY
  false # don't bother adding the file to the glob expansion
}

: **/*$~pattern*(ND.+colorize_file)

答え3

1) テキストの色付け方法の例

# creation of 3 escape sequences
C_1=$(echo -ne "\033[30;47m" ) ;
C_2=$(echo -ne "\033[32;41m" ) ;
C_3=$(echo -ne "\033[37;44m" ) ;
C_N=$(echo -ne "\033[0m"  )  ;

#simple example for using it
echo $C_1 Hello in C_1 $C_N normal ;
echo $C_2 Hello in C_2 $C_N normal ;
echo $C_3 Hello in C_3 $C_N normal ;

値はここで説明されています。 https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit

あなたの場合は単純なパターンを探しているので、sedコマンドのみを使用できます。

PAT="tot" ; 
find ./ -iname  \*$PAT\*  -printf '%P\n' | \
    sed "s/^\(.*\/\)\{0,1\}\([^\/]*\)\($PAT\)\([^\/]*\)\$/${C_1}\1${C_2}\2${C_3}\3${C_N}\4/i"

\1 is the full path ending with the last /
\2 is the pattern of the filename before the pattern
\3 is the pattern
\4 is after the pattern

関連情報