Câu 1sed 's/a/X/' f hoạt động thế nào trên mỗi dòng?
sed — Thay thế và Trích xuất
Thực hành sed: 's/a/X/' thay thế khớp đầu tiên trên mỗi dòng và g thay thế tất cả, -n '2p' in một dòng cụ thể, '/two/d' xóa các dòng khớp, và -i chỉnh sửa tệp trực tiếp — có minh họa, thực hành trên terminal trong trình duyệt.
Thay thế văn bản — s/old/new/ và g
sed là một stream editor: nó đọc đầu vào từng dòng một, biến đổi theo các quy tắc bạn đưa ra, rồi ghi kết quả ra ngoài. Công việc phổ biến nhất là thay thế, viết dưới dạng sed 's/old/new/'. s nghĩa là substitute (thay thế), / phân tách các phần, và nó thay old bằng new. Phần old cũng có thể dùng các biểu thức chính quy bạn đã học trước đó (^ $ . *).
Khi không có g ở cuối, s/old/new/ chỉ thay thế khớp đầu tiên tìm thấy trên mỗi dòng. Thêm g vào cuối như trong s/old/new/g thì thay thế mọi vị trí khớp trên dòng đó.
| Cú pháp | Ý nghĩa | Ví dụ |
|---|---|---|
s/old/new/ | Chỉ thay thế khớp đầu tiên trên mỗi dòng | sed 's/a/X/' f |
s/old/new/g | Thay thế tất cả khớp trên dòng | sed 's/a/X/g' f |
g thì chỉ khớp đầu tiên trên dòng thay đổi; có g thì mọi khớp trên dòng đều được thay thế.printf 'aaa\nbbb\n' > s.txt # tạo tệp tài liệu
sed 's/a/X/' s.txt # chỉ a đầu tiên -> Xaa
sed 's/a/X/g' s.txt # mọi a -> XXX
Trích xuất và xóa dòng — -n 'Np' và /pat/d
sed -n 'Np' chỉ in dòng N. Bạn điền số dòng cần hiển thị vào vị trí N (để lấy dòng 2, dùng 2p). Vì sed mặc định in mọi dòng, -n tắt đầu ra tự động đó, và p (print) chỉ định rõ dòng bạn muốn hiển thị. Vì vậy sed -n '2p' chỉ xuất ra dòng thứ hai.
sed '/pat/d' xóa các dòng khớp với pat và xuất phần còn lại. d là delete (xóa), và phần /pat/ là điều kiện chọn các dòng cần xóa. Dùng nó khi bạn muốn bỏ chỉ những dòng chứa một từ nhất định và xem phần còn lại.
| Cú pháp | Ý nghĩa | Ví dụ |
|---|---|---|
-n 'Np' | Chỉ in dòng N | sed -n '2p' f |
/pat/d | Xóa các dòng khớp với pat | sed '/two/d' f |
-n 'Np' chỉ lấy ra dòng được chỉ định, còn /pat/d xuất tất cả trừ các dòng khớp.printf 'one\ntwo\nthree\n' > lines.txt # tạo tệp tài liệu
sed -n '2p' lines.txt # chỉ dòng 2, two
sed '/two/d' lines.txt # one và three, không có dòng two
Chỉnh sửa tệp trực tiếp — sed -i
Cho đến nay sed chỉ in kết quả ra màn hình, giữ nguyên tệp gốc. Thêm sed -i thì chỉnh sửa tệp trực tiếp với kết quả. Nó rất tiện cho các thay thế hàng loạt trong các tệp cấu hình, nhưng vì nội dung gốc không được giữ lại, sau khi ghi lại hãy dùng cat để kiểm tra nội dung.
| Cú pháp | Ý nghĩa | Ví dụ |
|---|---|---|
-i | Chỉnh sửa tệp trực tiếp | sed -i 's/a/Z/' f |
-i thì chỉ in ra màn hình; có -i thì ghi lại bản thân tệp.sed -i không thể hoàn tác
sed -i ghi lại tệp trực tiếp và không giữ nội dung gốc. Trước khi dùng nó trên tệp cấu hình thật, cách an toàn là chạy trước không có -i, kiểm tra kết quả trên màn hình, xác nhận nó làm đúng ý bạn, và chỉ sau đó mới thêm -i.
printf 'apple\nbanana\n' > fruit.txt # tạo tệp tài liệu
sed -i 's/apple/cherry/' fruit.txt # chỉnh sửa tệp trực tiếp
cat fruit.txt # kiểm tra cherry và banana
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Chạy sed -n '2p' f hiển thị gì?
Câu 3-i trong sed -i 's/a/Z/' f làm gì?