Untuk mac, pendekatan yang lebih mirip adalah ini:
find . -name '*.txt' -print0 | xargs -0 sed -i "" "s/form/forms/g"
Sebagai solusi alternatif, saya menggunakan yang ini di Mac OSX 10.7.5
grep -ilr 'old-word' * | xargs [email protected] sed -i '' 's/old-word/new-word/g' @
Penghargaan diberikan kepada:jawaban Todd Cesere
OS X menggunakan campuran alat BSD dan GNU, jadi sebaiknya selalu periksa dokumentasinya (walaupun saya memilikinya less
bahkan tidak sesuai dengan halaman manual OS X):
https://web.archive.org/web/20170808213955/https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/sed.1.html
sed mengambil argumen setelah -i
sebagai ekstensi untuk cadangan. Berikan string kosong (-i ''
) tanpa cadangan.
Berikut ini yang harus dilakukan:
find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +
-type f
hanyalah praktik yang baik; sed akan mengeluh jika Anda memberikannya direktori atau lebih.
-exec
lebih disukai daripada xargs
; Anda tidak perlu repot dengan -print0
atau apa pun.
{} +
pada akhirnya berarti find
akan menambahkan semua hasil sebagai argumen ke satu instance dari perintah yang dipanggil, alih-alih menjalankannya kembali untuk setiap hasil. (Satu pengecualian adalah ketika jumlah maksimal argumen baris perintah yang diizinkan oleh OS dilanggar; dalam hal ini find
akan menjalankan lebih dari satu instance.)
Jika Anda mendapatkan kesalahan seperti "urutan byte tidak valid", mungkin membantu untuk memaksa lokal standar dengan menambahkan LC_ALL=C
di awal perintah, seperti:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/g {} +