Lakukan beberapa pengeditan dengan satu panggilan ke sed

14

Saya mencoba menggunakan sed untuk mengedit file konfigurasi. Ada beberapa baris yang ingin saya ubah. Saya tahu bahwa di Linux sed -imemungkinkan pengeditan di tempat tetapi mengharuskan Anda menyimpan ke file cadangan. Namun saya ingin menghindari memiliki beberapa file cadangan dan membuat semua perubahan di tempat saya sekaligus.

Apakah ada cara untuk melakukannya sed -iatau ada alternatif yang lebih baik?

rclark
sumber

Jawaban:

20

Anda dapat meminta seduntuk melakukan beberapa operasi hanya dengan mengulangi -e(atau-f jika skrip Anda ada dalam file).

sed -i -e 's/a/b/g' -e 's/b/d/g' file membuat kedua perubahan dalam satu file bernama file , di tempat. Tanpa file cadangan.

sed -ibak -e 's/a/b/g' -e 's/b/d/g' filemembuat kedua perubahan dalam file tunggal bernama file, di tempat. Dengan satu file cadangan bernama filebak.

EightBitTony
sumber
2
Perhatikan bahwa urutannya penting. Dalam contoh perintah yang diberikan di atas, semua instance dari huruf adiubah menjadi b, dan kemudian semua instance dari bdiubah menjadi d. Anda bisa melakukan hal yang sama dengan sed -i -e 's/a\|b/d/g' file—mengubah semua contoh salah satu aatau bke d.
Wildcard
4

Alternatif lain adalah ex, pendahulunya vi. Hal ini sebenarnya yang alat POSIX pilihan untuk mengedit file dalam-tempat scripted; itu sangat lebih fleksibel daripada sed -idan bisa dibilang lebih portabel daripada Perl. (Jika Anda tinggal di luar dunia Windows, itu tak terbantahkan lebih portabel dari Perl.)

Ada kelangkaan relatif pada stackexchange dari perintah contoh menggunakan ex, setidaknya dibandingkan dengan kebanyakan perintah contoh menggunakan sed, awkdan Perl. Namun, saya sendiri telah mempelajari spesifikasi POSIXex secara ekstensif dan saya telah memukul drum sejak saat itu. Saya telah menulis banyak jawaban menggunakan exkeduanya di sini dan di vi / Vim stackexchange:

Bacaan lebih lanjut:

Wildcard
sumber
3

Selain menggunakan beberapa -eopsi, Anda juga dapat memisahkan perintah sed dalam skrip sed tunggal menggunakan baris baru atau semi-titik dua.

Ini adalah kasus apakah skrip itu adalah satu-baris di baris perintah, atau file skrip.

misalnya

sed -e 's/a/b/g ; s/b/d/g' file

Karakter spasi di sekitar ;adalah opsional. Saya telah menggunakan mereka di sini untuk memastikan semi-colon menonjol (secara umum, kecuali untuk baris baru memisahkan perintah, spasi putih antara perintah diabaikan ... tapi jangan lupa bahwa ruang putih di dalam perintah dapat dan biasanya penting).

atau:

sed -e 's/a/b/g
        s/b/d/g' file
cas
sumber