Peringatan: ini adalah metode yang berbahaya! Itu menyalahgunakan buffer i / o di linux dan dengan opsi spesifik buffering berhasil bekerja pada file kecil. Ini merupakan keingintahuan yang menarik. Tetapi jangan menggunakannya untuk situasi nyata!
Selain -i
opsi sed
Anda dapat menggunakan tee
utilitas .
Dari man
:
tee - baca dari input standar dan tulis ke output dan file standar
Jadi, solusinya adalah:
sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee | tee index.html
- di sini tee
diulang untuk memastikan bahwa pipa disangga. Kemudian semua perintah dalam pipa diblokir sampai mereka mendapatkan beberapa input untuk bekerja. Setiap perintah dalam pipa dimulai ketika perintah hulu telah menulis 1 buffer byte (ukurannya ditentukan di suatu tempat ) ke input perintah. Jadi perintah terakhir tee index.html
, yang membuka file untuk ditulis dan oleh karena itu mengosongkannya, berjalan setelah pipa upstream selesai dan output berada di buffer dalam pipa.
Kemungkinan besar yang berikut ini tidak akan berfungsi:
sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee index.html
- itu akan menjalankan kedua perintah pipa pada saat yang sama tanpa ada pemblokiran. (Tanpa menghalangi pipa harus melewati garis byte dengan baris bukan buffer oleh penyangga. Sama seperti ketika Anda menjalankan cat | sed s/bar/GGG/
. Tanpa menghalangi itu lebih interaktif dan biasanya pipa dari hanya 2 perintah berjalan tanpa buffering dan menghalangi. Pipa yang lebih panjang akan buffered.) The tee index.html
kehendak buka file untuk ditulis dan itu akan dikosongkan. Namun, jika Anda selalu mengaktifkan buffering, versi kedua juga akan berfungsi.
perl -pi -w -e 's/STRING_TO_REPLACE/REPLACE_WITH/g;' index.html