GNUの場合grep:
N=10; grep -roP ".{0,$N}foo.{0,$N}" .
説明:
-o =>一致したもののみを印刷する
-P => Perlスタイルの正規表現を使用する
- 正規表現では、
$N文字に0が一致し、fooその後に文字が0で続き$Nます。
GNUがない場合grep:
find . -type f -exec \
perl -nle '
BEGIN{$N=10}
print if s/^.*?(.{0,$N}foo.{0,$N}).*?$/$ARGV:$1/
' {} \;
説明:
grepGNU grepであることに依存することができなくなったためfind、ファイルを再帰的に検索するために利用します(-rGNU のアクションgrep)。見つかったファイルごとに、Perlスニペットを実行します。
Perlスイッチ:
-n 行ごとにファイルを読む
-l 各行の最後にある改行を削除し、印刷時に元に戻します
-e 次の文字列をコードとして扱います
Perlスニペットは、本質的にと同じことをしていgrepます。$Nまず、変数に必要なコンテキスト文字の数を設定します。BEGIN{}手段これは、すべてのファイルのすべての行のためではない、一度実行の開始時に一度だけ実行されます。
各行に対して実行されるステートメントは、正規表現の置換が機能する場合にその行を印刷することです。
正規表現:
- 任意の古いものなまけ一致する1行の開始時に(
^.*?)が続く.{0,$N}のようgrepに続いて、ケースfoo別に続いて.{0,$N}、最終的にラインの最後まで遅延し、古いものと一致して(.*?$)。
- これをに置き換え
$ARGV:$1ます。$ARGVは、読み取られる現在のファイルの名前を保持する魔法の変数です。$1括弧が一致したもの:この場合のコンテキスト。
- 貪欲なマッチはマッチすること
fooなく失敗することなく前にすべての文字を食べるので、両端での遅延マッチが必要です(.{0,$N}ゼロ回マッチすることが許可されているため)。
1 つまり、これにより全体的な一致が失敗しない限り、何も一致させないことを好みます。要するに、できるだけ少ない文字に一致します。