Học bằng cách đọc theo thứ tự

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ĩaVí dụ
s/old/new/Chỉ thay thế khớp đầu tiên trên mỗi dòngsed 's/a/X/' f
s/old/new/gThay thế tất cả khớp trên dòngsed 's/a/X/g' f
s thay thế so với flag g
sed 's/a/X/' fchỉ a đầu tiênmỗi dòng -> Xsed 's/a/X/g' fmọi a trên dòng-> X
Không có 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

① Tạo tệp tài liệu 2 dòng bằng printf 'aaa\nbbb\n' > s.txt.

② Chạy lệnh sed thay thế cơ bản để đổi a thành X, và kiểm tra rằng chỉ ký tự đầu tiên trên mỗi dòng được thay thế.

③ Sau đó chạy dạng có flag ở cuối để thay thế trên toàn dòng, và kiểm tra rằng mọi a đều trở thành X. (Chạy đúng thì phần giải thích sẽ hiện ra.)

Linux console
0 / 3 đã hoàn thành
Loading Linux Terminal...

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ĩaVí dụ
-n 'Np'Chỉ in dòng Nsed -n '2p' f
/pat/dXóa các dòng khớp với patsed '/two/d' f
Trích xuất với -n p so với xóa với /pat/d
sed -n '2p' fchỉ hiện dòng 2(bỏ phần còn lại)sed '/two/d' fxóa dòng two,giữ phần còn lại
-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

① Tạo tệp tài liệu 3 dòng bằng printf 'one\ntwo\nthree\n' > lines.txt.

② Kết hợp tùy chọn tắt đầu ra tự động với chỉ thị in một số dòng cụ thể, và dùng sed để chỉ hiển thị dòng thứ hai.

③ Sau đó dùng chỉ thị xóa các dòng khớp để hiển thị phần còn lại với dòng chứa two đã bị xóa.

Linux console
0 / 3 đã hoàn thành
Loading Linux Terminal...

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ĩaVí dụ
-iChỉnh sửa tệp trực tiếpsed -i 's/a/Z/' f
sed -i thay đổi tệp, không phải màn hình
sed 's/a/Z/' fkết quả in ra(f không đổi)sed -i 's/a/Z/' fbản thân fbị ghi lại
Không có -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

① Tạo tệp tài liệu 2 dòng bằng printf 'apple\nbanana\n' > fruit.txt.

② Dùng lệnh thay thế sed với tùy chọn chỉnh sửa tệp trực tiếp, đổi apple thành cherry.

③ Chạy cat fruit.txt và kiểm tra rằng bản thân tệp đã được ghi lại thành cherrybanana.

Linux console
0 / 3 đã hoàn thành
Loading Linux Terminal...
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1sed 's/a/X/' f hoạt động thế nào trên mỗi dòng?

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ì?