私は以下を持っています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"
これは:
問題:パターンの後、色がリセットされる
ベース名の部分は完全に白である可能性があり、問題を解決します(ただし、これを変更する方法は見つかりませんでした)。
パスの部分については、上のスクリーンショットでわかるように、問題はあります。色がリセットされているため、ファイルパスが実際にどこで終了しているかはわかりません。
これに対する解決策はありますか?
EDIT-これには3つの解決策がありました!!以下のすべての提案は機能しますが、わずかな違いがありますが、質問に答えます。私はパターンのすべての出現を強調し、ほぼ1行であるものを選択しますが、それらはまったく同等であるため、正直に言うと選択は困難でした…
EDIT-これに対する改善を望んだ:分析まで検索結果がブロックされない、つまり出力がフラッシュされて処理されるということライン。これは可能ですか?
たぶんこんな感じ?
コマンド:
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
のpatternを強調表示したくない場合は、最後の行を削除します部。
grepの環境変数を参照 GREP_COLORS
詳細はセクション。
zsh
の組み込みglob演算子でそれを行うことができます。これにはいくつかの利点があります。
find
とgrep
はパターンを異なる方法で解釈します)-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)テキストを色付けする方法の例
# 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