-l -pe
Argüman ( -i
) olarak iletilen dosyalar üzerinde yerinde satır satır ( ) değiştirmeleri talimatı verilen küçük bir Perl betiği ile kaba bir şey yapabilirsiniz :
perl -i -l -pe '
if (/from/) { # is the source text present on this line?
printf STDERR ("%s: %s [y/N]? ", $ARGV, $_); # display a prompt
$r=<STDIN>; # read user response
if ($r =~ /^[Yy]/) { # if user entered Y:
s/from/to/g; # replace all occurences on this line
}' /path/to/files
Olası iyileştirmeler istemin bölümlerini renklendirmek ve “geçerli dosyadaki tüm olayları değiştir” gibi şeyleri desteklemek olabilir. Bir satırdaki her bir olayı ayrı ayrı istemek daha zor olurdu.
İkinci bölüm, dosyaları eşleştirme. çok fazla dosya yoksa ve zsh çalıştırıyorsanız, geçerli dizindeki ve alt dizinlerindeki tüm dosyaları özyinelemeli olarak eşleştirebilirsiniz:
perl -i -l -pe '…' **/*(.)
Kabuğunuz bash ≥4 ise, çalıştırabilirsiniz perl … **/*
, ancak sed dizinlerde çalışmayı dener (ve başarısız olur) çünkü sahte hata iletileri üretir. Değiştirme işlemini yalnızca C dosyaları gibi bir dizi dosyada gerçekleştirmek istiyorsanız, eşleşmeleri kısıtlayabilirsiniz (bash ≥4 veya zsh biçiminde çalışır):
perl -i -l -pe '…' **/*.[hc]
Hangi dosyaları değiştirdiğiniz üzerinde daha iyi denetime ihtiyacınız varsa veya kabuğunuzda özyinelemeli dizin eşleştirme yapısı **
yoksa veya çok fazla dosyanız varsa ve “komut satırı çok uzun” hatası alıyorsanız kullanın find
. Örneğin , geçerli dizinde *.h
veya *.c
alt dizinlerinde bulunan tüm dosyalarda ve alt dizinlerinde bir değiştirme gerçekleştirmek için (eski sistemlerde, satırın sonunda \;
yerine kullanmanız gerekebilir +
( +
form daha hızlıdır, ancak her yerde kullanılabilir değildir).
find . -type f -name '*.[hc]' -exec perl -i -l -pe '…' {} +
Bununla birlikte, etkileşime ihtiyacınız varsa etkileşimli bir editöre bağlı kalırım. Gert, Vim'de buna bir yol gösterdi , ancak aramak istediğiniz tüm dosyaları açmayı gerektirir, ancak çok fazla varsa sorun olabilir.
Emacs'ta bunu nasıl yapabileceğiniz aşağıda açıklanmıştır:
- Dosya adlarını
M-x find-name-dired
(bir üst düzey dizin M-x find-dired
belirtin ) veya (rasgele bir find
komut satırı belirtin ) ile toplayın .
- Ortaya çıkan dired arabelleğinde,
t
tüm dosyaları işaretlemek için düğmesine basın , ardından işaretli dosyalar üzerinde bilgi istemiyle bir değiştirme gerçekleştirmek için Q
( dired-do-query-replace-regexp
) düğmesine basın .
s/from/to/g
yerine, bir biçimlendirme aksaklığında olduğu gibi okurdum (Markdown ile yapamazsınız, ve HTML etiketleri).s/from/to/gc
c
<code>
<strong>