Bul ve sed (ara ve değiştir)


26

Mac'imde şu komutu kullanıyorum:

$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;

ve hiçbir etkisi yok gibi görünüyor.

Dizinde, her ikisinin de foo metninin bulunduğu .java ile biten iki dosyam var. Bir şey mi eksik?

EDIT: Yorum talebinden elde edilen sonuçlar

[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i 's/foo/bar/g' {} \;
sed: 1: "./bar.java": invalid command code .
sed: 1: "./foo.java": invalid command code .

2
Tam olarak kaçtığın şey bu mu? Ya -execondan sonraki her şeyi kaldırırsan ? Java dosyalarının adlarını yazdırıyor mu? (ASCII tırnak işaretleri yerine akıllı tırnak kullandığınız için endişeleniyorum.)
Mikel

1
Aslında, bu en azından benim için çözdü. Hem çift hem de tek tırnak sırasıyla "ve ile ikame edilmelidir '.
Lev Levitsky

2
Akıllı (?) Tırnak! .. :)
Peter.O

Yaptığım tam olarak çalıştığım şeydi. Birisi cevap yazabilir mi?
Amir Afgan,

1
Bir dahaki sefere lütfen soruyu sorduğunda gördüğün hata mesajını gönder. Herkes için zaman kazandıracak.
Mikel

Yanıtlar:


34

Her şeyden önce, kabuk komut dosyalarında normal ve ascii tırnak ( "ve 'ascii kodları 0x22ve 0x27sırasıyla) kullandığınızdan emin olun , çünkü yazınızdaki örnek standart olmayan alıntı karakterleri içerir. Eğer yakından bakarsanız, biraz farklı görünüyorlar. Muhtemelen bu, Word, OOWriter, hatta bir tarayıcı penceresi gibi zengin bir metin belgesi biçiminden kopyala-yapıştır hatasıdır.

Bir Mac'te olduğunuzdan, muhtemelen FreeBSD uygulamasına sahipsiniz, sedbu durumda komutu şu şekilde yazmak zorundasınız:

find . -name "*.java" -exec sed -i '' s/foo/bar/g {} +

(burada dosya başına bir çağrı çalıştırmamak için kullanmak +yerine ).\;sed

FreeBSD uygulamasında bir yedek dosyasının uzantısını: bayrak bir argüman gerekiyor. Örneğin , orijinal dosyadaki değiştirme işlemini gerçekleştirmeden önce komutla ilk olarak yedeklenir . Boş bir argüman kullanmak, istediğiniz gibi görünen bir yedekleme dosyasını kullanmamak anlamına gelir.sed-i-i .bakfile1.txtfile1.txt.bak''

GNU (veya NetBSD, OpenBSD, busybox) uygulamasındaki aynı şey:

find . -name "*.java" -exec sed -i s/foo/bar/g {} +

Yorumlarınızla cevabımı geliştirdiğim için @bahamat ve @Mikel ve @ pieter-breed teşekkür ederiz .


Kıvrımlı ayraçlar ne yapar?
Zane Hitchcox

3
@ZaneHitchcox kıvrımlı parantez eşleşen dosya adı için yer tutucudur
Monica'ya devam eden zararı durdurun
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.