4. Lọc (Filters)
4.2. Lọc soạn thảo: sed
Lọc soạn thảo thực hiện thao tác sửa chữa trên đầu vào, thường là các file văn bản. Nó đọc lần lượt từng dòng văn bản của đầu vào và sửa chữa chúng, sau đó hiển thị ra dòng văn bản đã được sửa. Ở đây chúng ta sẽ xem xét một tiện ích lọc soạn thảo, đó là sed (stream editor).
Filter sed thực hiện sửa đổi dữ liệu đầu vào từ file hay từ STDIN. Sau khi tạo ra một phiên bản dữ liệu đã sửa chữa, kết quảđược gửi ra STDOUT. Chú ý là nội dung của file đầu vào là không thay đổi.
Cú pháp của sed:
$ sed option ‘edit-command’ filename
Trong đó filename là tên file đầu vào, edit-command là lệnh soạn thảo. Lệnh này được đặt trong dấu nháy đơn để tránh việc thay thế các ký tự đặt biệt. Tập các lệnh soạn thảo của
sed giống như trong hệ soạn thảo Ed, nó gồm có: Xoá dòng: d
Lệnh d sẽ xoá đi một số dòng nào đó theo yêu cầu của người dùng. Ví dụ: Xoá dòng thứ 3 trong datafile
$ sed ‘3 d’ datafile
Nếu muốn xoá một dãy các dòng liên tiếp thì cần chỉ rõ dòng bắt đầu và dòng kết thúc, cách nhau bởi dấu (,). Nếu muốn xoá đến dòng cuối cùng của file thì ta dùng ký tự đại diện $.
Ví dụ: Xoá từ dòng 3 đến hết
$ sed ‘3,$ d’ datafile
Ví dụ: Xoá các dòng chứa từ Vezy
$ sed ‘/Vezy/ d’ datafile
Thay thế văn bản: s
Lệnh s thực hiện thay thế nội dung văn bản theo mẫu. Ví dụ: Thay thế Vezy bằng Very
$ sed ‘s/Vezy/Very/’ datafile
Nếu muốn chỉ thay thế trên một dòng nào đó, bạn chỉ rõ số thứ tự dòng cần thay thế. Ví dụ: Thay thế Vezy bằng Very tại dòng 3
$ sed ‘3 s/Vezy/Very/’ datafile
Chú ý là việc thay thế như trên chỉ được thực hiện một lần duy nhất tại mỗi dòng. Nếu có nhiều từ cần thay thế xuất hiện trên một dòng thì chỉ có từđầu tiên được thay thế. Để thay thế toàn bộ các từ trên dòng, ta cần thêm vào ký hiệu g.
Ví dụ: Thay thế tất cả các từ Vezy thành Very
$ sed ‘s/Vezy/Very/g’ datafile
Thêm dòng văn bản: a
Lệnh a cho phép thêm dòng văn bản vào sau một dòng nào đó, nếu muốn thêm nhiều dòng văn bản ta phải có ký tự xuống dòng (\).
Ví dụ: Thêm 2 dòng văn bản sau dòng 3.
$ sed ‘3 a\ Sit down please\
Have good meal’ datafile
Chèn dòng văn bản: i
Lệnh i thực hiện giống lệnh a, tuy nhiên nó sẽ chèn thêm các dòng vào trước dòng được chỉ ra.
Thay thế dòng văn bản: c
Lệnh c cho phép thay thế một dòng bằng các dòng khác. Có thể thay thế cho nhiều dòng liên tiếp bằng cách dùng miền giá trị.
Ví dụ:Thay thế dòng 3 bằng dòng mới.
$ sed ‘3 c\
Get up please’ datafile
Tuỳ chọn -f
Lệnh sed cung cấp tuỳ chọn –f cho phép nhận các lệnh sửa đổi chứa trong một file cho trước.
Ví dụ: Thực hiện sửa đổi datafile bởi các lệnh trong file suadoi
$ cat > suadoi 2 d
Thang Long University s/fine/glad/g
$ sed -f suadoi datafile