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
$N
izledi karakterlerin foo
0 izledi $N
karakterler.
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 grep
GNU'yu olmanın grep
, biz faydalanmak find
yinelemeli dosyaları aramak için ( -r
GNU 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 $N
iç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 foo
başka izledi .{0,$N}
ve sonunda hattın sonuna kadar tembel herhangi eski şeyi eşleşmesi ( .*?$
).
- Bununla ikame ediyoruz
$ARGV:$1
. $ARGV
okunmakta olan dosyanın adını tutan büyülü bir değişkendir. $1
parenler ne eşleşti: bu durumda bağlam.
- Her iki uçtaki tembel maçlar zorunludur, çünkü açgözlü bir maç maçta
foo
baş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.