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 .
-exec
dan semuanya setelah itu? Apakah itu mencetak nama file Java? (Saya khawatir Anda menggunakan kutipan pintar dan bukan kutipan ASCII.)"
dan'
, masing-masing.Jawaban:
Pertama-tama, pastikan Anda menggunakan tanda kutip ascii biasa seperti
"
dan'
(kode ascii0x22
dan0x27
, 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:(Di sini menggunakan
+
alih-alih\;
menghindari menjalankan satused
doa per file).Dalam pelaksanaan FreeBSD dari
sed
para-i
bendera kebutuhan argumen: ekstensi dari file cadangan. Misalnya dengan-i .bak
perintah akan backupfile1.txt
sebagaifile1.txt.bak
pertama 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:
Terima kasih @bahamat dan @Mikel dan @ pieter-breed untuk meningkatkan jawaban saya dengan komentar Anda.
sumber