temukan & sed (cari dan ganti)

27

Saya menggunakan perintah berikut di mac saya:

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

dan tampaknya tidak berpengaruh.

Saya memiliki dua file di direktori yang berakhiran .java, yang keduanya memiliki teks foo di dalamnya. Apakah saya melewatkan sesuatu?

EDIT: Hasil dari permintaan komentar

[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 .
Amir Afghani
sumber
2
Apakah itu tepatnya yang Anda jalankan? Bagaimana jika Anda menghapus -execdan semuanya setelah itu? Apakah itu mencetak nama file Java? (Saya khawatir Anda menggunakan kutipan pintar dan bukan kutipan ASCII.)
Mikel
1
Sebenarnya, itu menyelesaikannya, setidaknya untukku. Kutipan ganda dan tunggal harus diganti oleh "dan ', masing-masing.
Lev Levitsky
2
Kutipan pintar (?)! .. :)
Peter.O
Apa yang saya tempel persis seperti apa yang saya jalankan. Bisakah seseorang mengirim jawaban?
Amir Afghani
1
Lain kali tolong posting pesan kesalahan yang Anda lihat ketika Anda mengajukan pertanyaan. Ini akan menghemat waktu untuk semua orang.
Mikel

Jawaban:

34

Pertama-tama, pastikan Anda menggunakan tanda kutip ascii biasa seperti "dan '(kode ascii 0x22dan 0x27, masing-masing) dalam skrip shell, karena contoh dalam posting Anda berisi karakter kutipan non-standar. Jika Anda perhatikan lebih dekat, mereka terlihat sedikit berbeda. Kemungkinan besar ini adalah kesalahan salin-tempel dari format dokumen teks kaya seperti Word, OOWriter, atau bahkan jendela browser.

Karena Anda menggunakan Mac, kemungkinan besar Anda memiliki implementasi FreeBSD sed, dalam hal ini Anda harus menulis perintah dengan cara ini:

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

(Di sini menggunakan +alih-alih \;menghindari menjalankan satu seddoa per file).

Dalam pelaksanaan FreeBSD dari sedpara -ibendera kebutuhan argumen: ekstensi dari file cadangan. Misalnya dengan -i .bakperintah akan backup file1.txtsebagai file1.txt.bakpertama sebelum melakukan penggantian di file asli. Menggunakan argumen kosong ''berarti tidak menggunakan file cadangan, yang tampaknya seperti yang Anda inginkan.

Hal yang sama dalam implementasi GNU (atau NetBSD, OpenBSD, busybox) adalah:

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

Terima kasih @bahamat dan @Mikel dan @ pieter-breed untuk meningkatkan jawaban saya dengan komentar Anda.

Hentikan bahaya yang berkelanjutan pada Monica
sumber
Apa yang dilakukan kurung kurawal?
Zane Hitchcox
3
@ZaneHitchcox kurung kurawal adalah penampung untuk nama file yang cocok
Hentikan bahaya yang berkelanjutan untuk Monica