sed - bagaimana cara melakukan beberapa penggantian secara berurutan tetapi memproses file hanya sekali?

31

Jika saya melakukan beberapa pergantian yang harus berturut-turut, mis

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/' t1_spec.rb
sed -i '/expect(browser.*\.should/s/\.should/).should/' t1_spec.rb
sed -i 's/\.should/\.to/' t1_spec.rb 
sed -i 's/==/eq/' t1_spec.rb 

Apakah ada cara yang lebih baik untuk melakukan ini yang hanya akan melalui t1_spec.file sekali dan melakukan 4 substitusi untuk setiap baris daripada melalui file 4 kali?

Michael Durrant
sumber

Jawaban:

43

Selain menggunakan tanda titik koma, Anda juga dapat memberikan lebih dari satu ekspresi pada sed dengan menggunakan -eflag:

sed -i -e 's/expr1/replace1/' -e 's/expr2/replace2/'  t1_spec.rb 
Jofel
sumber
14

Dalam GNU (mis. Di mesin Ubuntu saya), cukup menggunakan beberapa baris didukung dan bekerja dengan baik dan terlihat bagus (imho) karena menghindari garis super panjang, misalnya

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/
        /expect(browser.*\.should/s/\.should/).should/
        s/\.should/\.to/
        s/==/eq/' t1_spec.rb 
Michael Durrant
sumber
5

Anda dapat menggunakan titik koma untuk memisahkan substitusi yang berbeda antara tanda kutip tunggal atau Anda dapat menempatkan semua perintah itu dalam file dan menentukan file dengan -fopsi untuk sed.

Menggunakan file ini sangat berguna jika Anda akan menggunakan serangkaian sedperintah yang sama berulang kali. Saya dulu harus berurusan dengan umpan data kotor dan saya berakhir dengan file baris 88 yang dipanggil massage.seduntuk secara otomatis menghapus sebagian besar kesalahan umum yang saya dapatkan dari umpan.

kurtm
sumber