Di shell linux, perintah berikut ini akan secara rekursif mencari dan mengganti semua instance 'this' dengan 'that' (saya tidak memiliki shell Linux di depan saya, tetapi harus dilakukan).
find . -name "*.txt" -print | xargs sed -i 's/this/that/g'
Seperti apakah perintah yang serupa pada OSX?
apple.stackexchange.com
karena tidak cukup umum untuk linux atau semua pengembang.Jawaban:
OS X menggunakan campuran alat BSD dan GNU, jadi sebaiknya selalu periksa dokumentasi (meskipun saya memilikinya yang
less
bahkan tidak sesuai dengan 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.Yang berikut harus dilakukan:
LC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
Ini
-type f
hanya praktik yang baik; sed akan mengeluh jika Anda memberikannya direktori atau lebih.-exec
lebih disukai daripadaxargs
; Anda tidak perlu repot dengan-print0
atau apapun. The{} +
di bagian akhir berarti bahwafind
akan menambahkan semua hasil sebagai argumen untuk 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 inifind
akan menjalankan lebih dari satu contoh.)sumber
%
karakter:sed "s%localhost/site%blah/blah%"
. Alternatif lain adalah dengan backslash-melarikan diri pemisah:sed "s/localhost\/site/blah\/blah/"
.illegal byte sequence
kesalahan? jika demikian, cobaLC_ALL=C find . -type f -name '*.txt' -exec sed -i '' s/this/that/ {} +
:, itu berhasil untuk saya./g
untuk beberapa ocurrency sepertiLC_ALL=C find . -type f -exec sed -i '' s/search/replace/g {} +
Untuk mac, pendekatan yang lebih mirip adalah ini:
sumber
find . -name '*.php' -print0 | xargs -0 sed -i "" "s/easyform/form360/g"
Sebagai solusi alternatif, saya menggunakan yang ini di Mac OSX 10.7.5
Kredit pergi ke: jawaban Todd Cesere ini
sumber
Pada Mac OSX 10.11.5 ini berfungsi dengan baik:
sumber
Tidak satu pun di atas berfungsi di OSX.
Lakukan hal berikut:
sumber
Versi yang berfungsi di Linux dan Mac OS X (dengan menambahkan
-e
sakelar kesed
):sumber
export LC_CTYPE=C && export LANG=C
Setiap kali saya mengetik perintah ini, saya sepertinya selalu menyumbatnya, atau lupa bendera. Saya membuat Gist di github berdasarkan dari jawaban TaylanUB yang menggantikan global find dari direktori saat ini. Ini spesifik untuk Mac OSX.
https://gist.github.com/nateflink/9056302
Sangat menyenangkan karena sekarang saya hanya membuka terminal kemudian menyalin:
curl -s https://gist.github.com/nateflink/9056302/raw/findreplaceosx.sh | bash -s "find-a-url.com" "replace-a-url.com"
Anda bisa mendapatkan beberapa kesalahan urutan byte aneh, jadi di sini adalah kode lengkap:
sumber
Ini yang bisa saya kerjakan. pada mac OS X 10.10.4
Yang menggunakan find di atas akan mengubah file yang tidak mengandung teks pencarian (tambahkan baris baru di ujung file), yang verbose.
sumber
Jika Anda menggunakan terminal zsh Anda dapat menggunakan wildcard magic:
sed -i "" "s/search/high-replace/g" *.txt
sumber
Saya menggunakan format ini - tapi ... Saya menemukan saya harus menjalankannya tiga kali atau lebih untuk membuatnya benar-benar mengubah setiap contoh yang saya temukan sangat aneh. Menjalankannya sekali akan mengubah beberapa di setiap file tetapi tidak semua. Menjalankan string yang persis sama dua-empat kali akan menangkap semua instance.
sumber
g
di akhir, jika tidak, itu hanya menggantikan kemunculan pertamathistext
dalam sebuah baris. Jadi regex Anda seharusnyas/thistext/newtext/g
https://bitbucket.org/masonicboom/serp adalah utilitas go (yaitu lintas platform), diuji pada OSX, yang melakukan pencarian dan ganti rekursif untuk teks dalam file dalam direktori yang diberikan, dan mengonfirmasi setiap penggantian. Ini baru, jadi mungkin buggy.
Penggunaannya terlihat seperti:
sumber
Lihat di sini untuk info lebih lanjut.
sumber
Perintah pada OSX harus persis sama dengan Unix di bawah UI cantik.
sumber
-print0
menambahkan kefind
bendera dan-0
kexargs
bendera.-exec sed -i s/this/that/g {} \+
bukannya-print
xargsxargs
mungkin melihat spasi-dibatasi "./jacobus" sebagai file untuk diteruskansed
, dan kemudian dengan "R.txt" , tidak ada yang ada.bisa saja mengatakan $ PWD bukannya "."
sumber