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/
' {} \;
説明:
grep
GNU grep
であることに依存することができなくなったためfind
、ファイルを再帰的に検索するために利用します(-r
GNU のアクション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 つまり、これにより全体的な一致が失敗しない限り、何も一致させないことを好みます。要するに、できるだけ少ない文字に一致します。