grep: 各行の色のみの最初の一致

grep: 各行の色のみの最初の一致
INPUT | grep --color=always "$string\{1,1\}"

...ああ、$ stringのすべてのインスタンスが強調表示されます。文書を読むとき、「{1,1}」は最初のインスタンスのみを強調表示する必要があります。それとももっと良いツールがありますか? sed は使用できません

INPUT | sed -r "s|$string|${red}$string${nrm}|I"

(${red}と${nrm}はカラーコードのみです)

ここでINPUTは大文字と小文字を区別せずに見つけることができるファイルのリストなので、sedの「I」オプションを使用すると、ファイルリストの大文字と小文字がコマンド入力の正確なテキストに変わります。つまり、はい、大文字と小文字を区別しないファイルを検索したいが、ファイルリスト内の文字列の大文字と小文字に関係なく強調表示されます。

my_command *file_name*

...大文字と小文字を区別せずにファイルを見つけるために「検索」を使用しますが、リストで強調したいことは次のとおりです。

file_name 
FILE_nAME 
file_NAME_this_file_has_a_long_file_name

...しかし、最初の場合にのみ適用されます(ファイル名に入力文字列の重複を含めることができます)。したがって、上記の最後の行では「file_NAME」は強調表示されますが、「file_name」は強調表示されません。

grepは大文字と小文字の問題に問題はありませんが、sedには問題があります。 OTOH、sedは試合後に停止する方法を知っていますが、grepはわからないようです。それとももっと良い方法がありますか?

ベストアンサー1

grepPerlに似た正規表現をサポートしている場合は、-P次のことができます。

grep --color=always -P "^.*?\K\Q$string\E"

^一致は行の先頭に固定されているため、1行に1回しか一致できません。以下は、.*?必要な数の文字と一致するものです。できるだけ少ない、および/$string内で\Q、変数に正規表現演算子(除外)が含まれていても、\Eその内容は文字通り一致します。次の内容だけがeptとして指定されるので、ここでは色で表示されます。$string\E\KK

あるいは、GNUismに依存せずに実際を使用することもできます。

STRING=$string perl -ne 'print if s/\Q$ENV{STRING}\E/\e[31m$&\e[m/'

含まれていても$string有効です\E

おすすめ記事