Saat di OSX, saya selalu menginstal versi sed GNU melalui Homebrew, untuk menghindari masalah pada skrip, karena sebagian besar skrip ditulis untuk versi sed GNU.
brew install gnu-sed --with-default-names
Kemudian sed BSD Anda akan diganti dengan sed GNU.
Atau, Anda dapat menginstal tanpa nama default, tetapi kemudian:
- Ubah
PATH
Anda seperti yang diinstruksikan setelah menginstalgnu-sed
- Periksa skrip Anda untuk memilih antara
gsed
ataused
tergantung pada sistem Anda
Ini berfungsi dengan GNU sed, tetapi tidak pada OS X:
sed -i -e 's/foo/bar/' target.file
sed -i'' -e 's/foo/bar/' target.file
Ini berfungsi pada OS X, tetapi tidak dengan GNU sed:
sed -i '' -e 's/foo/bar/' target.file
Di OS X Anda
- tidak dapat menggunakan
sed -i -e
karena ekstensi file cadangan akan disetel ke-e
- tidak dapat menggunakan
sed -i'' -e
untuk alasan yang sama—membutuhkan spasi antara-i
dan''
.
Jika Anda benar-benar ingin menggunakan sed -i
cara 'mudah', berikut TIDAK bekerja pada GNU dan BSD/Mac sed
:
sed -i.bak 's/foo/bar/' filename
Perhatikan kurangnya ruang dan titik.
Bukti:
# GNU sed
% sed --version | head -1
GNU sed version 4.2.1
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file file.bak
% cat ./file
bar
# BSD sed
% sed --version 2>&1 | head -1
sed: illegal option -- -
% echo 'foo' > file
% sed -i.bak 's/foo/bar/' ./file
% ls
file file.bak
% cat ./file
bar
Jelas Anda bisa menghapus .bak
file.
Seperti yang ditanyakan Noufal Ibrahim, mengapa Anda tidak bisa menggunakan Perl? Setiap Mac akan memiliki Perl, dan hanya ada sedikit distribusi Linux atau BSD yang tidak menyertakan beberapa versi Perl di sistem dasarnya. Satu-satunya lingkungan yang mungkin kekurangan Perl adalah BusyBox (yang berfungsi seperti GNU/Linux untuk -i
, kecuali tidak ada ekstensi cadangan yang dapat ditentukan).
Seperti yang direkomendasikan oleh ismail,
Karena perl tersedia di mana saja, saya hanya melakukan
perl -pi -e s,foo,bar,g target.file
dan ini sepertinya solusi yang lebih baik di hampir semua kasus daripada skrip, alias, atau solusi lain untuk mengatasi ketidakcocokan mendasar sed -i
antara GNU/Linux dan BSD/Mac.