sed - làm thế nào để thực hiện một số thay thế liên tiếp nhưng xử lý tập tin chỉ một lần?


31

Nếu tôi đang thực hiện một số thay thế cần phải liên tiếp, ví dụ

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 

Có cách nào tốt hơn để làm điều này sẽ chỉ đi qua t1_spec.file một lần và thực hiện 4 thay thế cho mỗi dòng thay vì đi qua tệp 4 lần?

Câu trả lời:


43

Bên cạnh việc sử dụng dấu chấm phẩy, bạn cũng có thể cung cấp nhiều hơn một biểu thức cho sed bằng cách sử dụng -ecờ:

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

14

Trong GNU (ví dụ trên máy Ubuntu của tôi), chỉ cần sử dụng nhiều dòng được hỗ trợ và hoạt động tốt và trông tốt (imho) vì nó tránh được các dòng siêu dài, ví dụ:

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

5

Bạn có thể sử dụng dấu chấm phẩy để phân tách các trạm biến áp khác nhau giữa các dấu ngoặc đơn hoặc bạn có thể đặt tất cả các lệnh đó vào một tệp và chỉ định tệp có -ftùy chọn sed.

Sử dụng tệp đặc biệt hữu ích nếu bạn sẽ sử dụng cùng một nhóm sedlệnh nhiều lần. Tôi đã từng phải đối phó với một nguồn cấp dữ liệu bẩn và tôi đã kết thúc theo thời gian với một tệp 88 dòng được gọi massage.sedđể tự động xóa hầu hết các lỗi phổ biến tôi gặp phải từ nguồn cấp dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.