Saya ingin mengedit file dengan sed pada OS X. Saya menggunakan perintah berikut:
sed 's/oldword/newword/' file.txt
Keluaran dikirim ke terminal. file.txt tidak dimodifikasi. Perubahan disimpan ke file2.txt dengan perintah ini:
sed 's/oldword/newword/' file1.txt > file2.txt
Namun saya tidak ingin file lain. Saya hanya ingin mengedit file1.txt . Bagaimana saya bisa melakukan ini?
Saya sudah mencoba flag -i. Ini menghasilkan kesalahan berikut:
sed: 1: "file1.txt": invalid command code f
-i
bendera?Jawaban:
Anda dapat menggunakan
-i
flag dengan benar dengan memberikan suffix untuk ditambahkan ke file yang dicadangkan. Memperluas contoh Anda:Akan memberi Anda dua file: satu dengan nama
file1.txt
yang berisi substitusi, dan satu dengan namafile1.txt.bu
yang memiliki konten asli.Agak berbahaya
Jika Anda ingin menimpa file asli secara destruktif, gunakan sesuatu seperti:
Karena cara garis diuraikan, diperlukan spasi antara flag opsi dan argumennya karena argumennya panjang nol.
Selain mungkin merusak sumber asli Anda, saya tidak mengetahui ada bahaya lebih lanjut dari menipu dengan cara ini. Namun perlu dicatat bahwa jika permohonan
sed
ini merupakan bagian dari skrip, The Unix Way ™ akan menggunakan (sed
non-destruktif), menguji apakah itu keluar dengan bersih, dan hanya kemudian menghapus file asing.sumber
-i''
berbahaya karena alasan apa pun selain berpotensi mengacaukan file asli (dan tidak memiliki cadangan)?sed
halaman manual jika Anda kehabisan ruang disk pada perangkat Anda dapat merusak file saat sedang berjalan dan memiliki hasil output yang buruk. Jika Anda bekerja di bawah kendali sumber lokalsed -i ""
tanpa cadangan, sebagian besar waktu akan baik-baik saja (atau sesaatgit init && git add -A . && git commit -m 'backup'
sebelum menjalankan-i
mode sed ).-i''
ini valid, tetapi-i ''
tidak.Saya punya masalah serupa dengan MacOS
tidak berhasil, tapi
bekerja dengan baik.
sumber
sed -i '' <file>
bekerja tetapised -i'' <file>
tidak lagi berfungsisumber
Anda dapat menggunakan
-i''
(--in-place
) untuksed
seperti yang disarankan. Lihat: The-i
di tempat argumen , namun perhatikan bahwa-i
pilihan adalah ekstensi FreeBSD non-standar dan mungkin tidak tersedia pada sistem operasi lain. Keduased
adalah S tream ED itor, bukan file editor .Cara alternatif adalah dengan menggunakan substitusi bawaan dalam mode Vim Ex, seperti:
dan untuk banyak file:
Untuk mengedit semua file secara rekursif, Anda dapat menggunakan
**/*.*
jika shell mendukungnya (diaktifkan olehshopt -s globstar
).Cara lain adalah dengan menggunakan
gawk
dan ekstensi "inplace" yang baru seperti:sumber
Ini menciptakan file cadangan. Misalnya
sed -i -e 's/hello/hello world/' testfile
untuk saya, buat file cadangan, testfile-e, di dir yang sama.sumber
Kamu bisa memakai:
Contoh:
Ini berfungsi sempurna di Mac .
sumber
-i
membutuhkan argumen untuk macOS. Karena Anda tidak menentukan satu, itu menggunakan-e
, yang menghasilkan memiliki file kedua dengan-e
ditambahkan.-e
tidak ada di macOS, itu-E
. Jadi perintah yang benar untuk macOS adalahsed -i '' -E 's/Hello/Bye/' file.txt