GNU ile grep:
N=10; grep -roP ".{0,$N}foo.{0,$N}" .
Açıklama:
-o => Yalnızca eşleştiğini yazdır
-P => Perl tarzı normal ifadeler kullanın
- Regex için 0 maç söylüyor
$Nizledi karakterlerin foo0 izledi $Nkarakterler.
Eğer GNU'nuz yoksa grep:
find . -type f -exec \
perl -nle '
BEGIN{$N=10}
print if s/^.*?(.{0,$N}foo.{0,$N}).*?$/$ARGV:$1/
' {} \;
Açıklama:
Artık güvenebilirsiniz yana grepGNU'yu olmanın grep, biz faydalanmak findyinelemeli dosyaları aramak için ( -rGNU eylem grep). Bulunan her dosya için Perl kod parçasını çalıştırıyoruz.
Perl anahtarları:
-n Dosyayı satır satır okuyun
-l Her çizginin sonundaki yeni çizgiyi kaldırın ve yazdırırken geri koyun
-e Aşağıdaki dizgiye kod olarak bak
Perl pasajı aslında aynı şeyi yapıyor grep. İstediğiniz $Niçerik karakter sayısına bir değişken ayarlayarak başlar . Bunun BEGIN{}anlamı, çalıştırmanın başlangıcında sadece bir defa değil, her dosyadaki her satır için bir defa değil.
Her satır için yürütülen ifade, regex ikamesi işe yarıyorsa satırı yazdırmaktır.
Regex:
- Herhangi eski şeyi lazily Eşleşme 1 satırın başında (
^.*?), ardından .{0,$N}olduğu gibi grep, ardından durumunda foobaşka izledi .{0,$N}ve sonunda hattın sonuna kadar tembel herhangi eski şeyi eşleşmesi ( .*?$).
- Bununla ikame ediyoruz
$ARGV:$1. $ARGVokunmakta olan dosyanın adını tutan büyülü bir değişkendir. $1parenler ne eşleşti: bu durumda bağlam.
- Her iki uçtaki tembel maçlar zorunludur, çünkü açgözlü bir maç maçta
foobaşarısız olmadan önce tüm karakterleri yiyecektir (çünkü .{0,$N}sıfır kez eşleşmesine izin verilir).
1 Bu, genel eşleşmenin başarısız olmasına neden olmadıkça hiçbir şey eşleştirmemeyi tercih eder. Kısacası, mümkün olduğunca az karakter eşleştirin.