web-dev-qa-db-ja.com

ハイライトされたパターンで色付けされたgrep出力

私は以下を持っています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"

これは:

  • パス部分に色を付ける
  • ベース名部分のパターンに色を付ける

enter image description here

問題:パターンの後、色がリセットされる

ベース名の部分は完全に白である可能性があり、問題を解決します(ただし、これを変更する方法は見つかりませんでした)。

パスの部分については、上のスクリーンショットでわかるように、問題はあります。色がリセットされているため、ファイルパスが実際にどこで終了しているかはわかりません。

これに対する解決策はありますか?

EDIT-これには3つの解決策がありました!!以下のすべての提案は機能しますが、わずかな違いがありますが、質問に答えます。私はパターンのすべての出現を強調し、ほぼ1行であるものを選択しますが、それらはまったく同等であるため、正直に言うと選択は困難でした…

EDIT-これに対する改善を望んだ:分析まで検索結果がブロックされない、つまり出力がフラッシュされて処理されるということライン。これは可能ですか?

2
user3341592

たぶんこんな感じ?

enter image description here

コマンド:

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

dirnamepatternを強調表示したくない場合は、最後の行を削除します部。

grepの環境変数を参照 GREP_COLORS 詳細はセクション。

2
αғsнιη

zshの組み込みglob演算子でそれを行うことができます。これにはいくつかの利点があります。

  • この問題を簡単に修正する
  • 改行文字を含むパス名を操作する
  • ベース名のみのパターンを強調表示するのを簡単にする
  • ワイルドカードを使用する(アプローチでは、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に渡す前に、リスト全体を作成およびソートすることに注意してください。したがって、すべてのファイルが見つかると、出力の取得を開始します。見つかったときにそれらを印刷するには(ただし、並べ替えをあきらめる必要があります)、代わりにグロブ修飾子関数にカラー化されたファイルを印刷させることができます。

#! /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)
1

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コマンドは1つしか使用できません。

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
0
EchoMike444