GNU/Linux >> Belajar Linux >  >> Linux

sed in-place flag yang berfungsi baik di Mac (BSD) dan Linux

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 menginstal gnu-sed
  • Periksa skrip Anda untuk memilih antara gsed atau sed 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.


Linux
  1. Cara Mengarahkan Output ke File dan Stdout di Linux

  2. Tip dan trik .htaccess Linux

  3. perintah sed dengan opsi -i gagal di Mac, tetapi berfungsi di Linux

  1. Sistem File yang Didukung dan Direkomendasikan di Linux

  2. Pencarian dan penggantian rekursif dalam file teks di Mac dan Linux

  3. Mungkinkah deskriptor file linux 0 1 2 bukan untuk stdin, stdout dan stderr?

  1. sed Contoh Perintah di Linux

  2. Bagaimana cara mengosongkan (memotong) file di linux yang sudah ada dan dilindungi?

  3. Temukan file lalu cd ke direktori itu di Linux