Hướng dẫn 9 cách chỉnh sửa văn bản với lệnh sed trên Linux

Một trong những công cụ hàng đầu để chỉnh sửa văn bản trong Linux là sed, một trình soạn thảo luồng (stream editor). Đây là một trình chỉnh sửa văn bản không có giao diện, thực hiện các thao tác một cách lặng lẽ, trực tiếp từ dòng lệnh. Từ những bản sửa lỗi nhanh chóng đến các biến đổi văn bản nâng cao, dưới đây là chín cách mà lệnh sed giúp việc chỉnh sửa trở nên dễ dàng hơn.
Xem thêm: Hướng dẫn cách thiết lập khôi phục máy tính nhanh (Quick Machine Recovery) trên Windows 11
1. Tìm và thay thế văn bản (cơ bản và nâng cao)
Thay thế văn bản là cách sử dụng phổ biến nhất của lệnh sed. Lệnh này đặc biệt hữu ích khi làm việc với các tệp tin lớn trong terminal, giúp bạn tìm và thay thế nội dung mà không cần mở một trình soạn thảo văn bản riêng biệt. Chạy sed
trực tiếp từ terminal không chỉ tăng hiệu quả và tốc độ làm việc mà còn mang lại nhiều tùy chọn tùy chỉnh hơn so với hộp thoại tìm kiếm và thay thế thông thường.
Cú pháp cơ bản để tìm và thay thế văn bản rất đơn giản:
sed 's/old/new/' file.txt
Trong đó, s
là lệnh substitute (thay thế), old
là văn bản bạn muốn tìm, và new
là văn bản bạn muốn thay thế.
Theo mặc định, sed chỉ thay thế lần xuất hiện đầu tiên trên mỗi dòng. Tuy nhiên, trong nhiều trường hợp, bạn cần hoán đổi tất cả các lần xuất hiện của từ được nhắm mục tiêu. Để làm điều đó, hãy thêm cờ global (g
) vào cuối lệnh:
sed 's/old/new/g' file.txt
Lúc này, mọi lần xuất hiện của từ trên mỗi dòng sẽ được thay thế.
Bạn cũng có thể thay thế văn bản trên một dòng cụ thể bằng cách chỉ định số dòng trước tùy chọn s
:
sed '10s/old/new/' file.txt
Lệnh này chỉ thay thế văn bản trên dòng thứ 10. Tương tự, bạn có thể thay thế văn bản trong một phạm vi các dòng bằng cách chỉ định số dòng bắt đầu và kết thúc, được phân tách bằng dấu phẩy:
sed '10,20s/old/new/' file.txt
Ngoài việc thay thế theo dòng, bạn còn có thể chọn lọc hơn bằng cách yêu cầu sed chỉ hoạt động nếu một dòng khớp với một mẫu cụ thể:
sed '/ERROR/s/old/new/g' file.txt
Bằng cách này, sed chỉ thay thế văn bản trong các dòng khớp với mẫu (như ERROR
trong trường hợp này) trong khi giữ nguyên các dòng còn lại.
2. Chèn, nối và xóa nội dung
Khi làm việc với các tệp tin, ba tác vụ bạn thường xuyên thực hiện nhất là chèn, nối và xóa nội dung. Với sed, bạn có thể xử lý cả ba tác vụ này một cách trơn tru và hiệu quả mà không cần mở tệp trong một trình soạn thảo.
Đầu tiên, hãy nói về việc chèn nội dung. Sử dụng sed, bạn có thể thêm nội dung vào bất kỳ vị trí nào trong tệp—trước hoặc sau một dòng cụ thể. Ví dụ, nếu bạn đang làm việc với một tệp cấu hình và muốn thêm một cài đặt mới trước dòng thứ 3, bạn có thể sử dụng cờ i
(viết tắt của insert – chèn):
sed '3i\ # New setting\ ENABLE_FEATURE=true' config.conf
Tương tự, nếu bạn muốn văn bản xuất hiện sau dòng thứ 10, chỉ cần thay i
bằng a
(viết tắt của append – nối):
sed '3a\ Added text' file.txt
Một cách dễ nhớ là hãy nghĩ đến i
là chèn trước và a
là nối sau.
Đôi khi, việc thay thế toàn bộ một dòng sẽ gọn gàng hơn là chỉnh sửa từng phần của nó. Để làm điều đó, bạn sử dụng tùy chọn c
(viết tắt của change – thay đổi). Ví dụ: nếu bạn có một tệp thuộc tính với số phiên bản và muốn cập nhật nó, bạn có thể thay thế toàn bộ dòng:
sed '/^version=/c\version=2.0.0' config.conf
Lệnh này sẽ xóa dòng cũ và ghi dòng mới của bạn vào vị trí của nó.
Nếu bạn muốn xóa hoàn toàn một dòng mà không thêm bất cứ điều gì mới, hãy sử dụng tùy chọn d
(viết tắt của delete – xóa):
sed '3d' file.txt
Lệnh trên sẽ xóa dòng thứ 3. Ngoài ra, bạn cũng có thể xóa một khối dòng bằng cách chỉ định một phạm vi như sau:
sed '5,10d' file.txt
Lệnh này sẽ xóa các dòng từ 5 đến 10.
Cũng giống như cách chúng ta đã sử dụng khớp mẫu để tìm và thay thế, chúng ta có thể dùng sed để xóa dựa trên mẫu. Ví dụ, nếu một tệp nhật ký chứa hàng nghìn mục nhập DEBUG, bạn có thể xóa tất cả chúng cùng một lúc:
sed '/DEBUG/d' logfile.txt
Ban đầu, những lệnh này có vẻ phức tạp, nhưng một khi bạn bắt đầu sử dụng, bạn sẽ nhanh chóng thực hiện các thao tác cơ bản này chỉ với vài lần gõ phím.
Với lệnh sed, bạn có thể dễ dàng hiển thị và trích xuất nội dung từ tệp tin, giúp việc phân tích dữ liệu trở nên hiệu quả hơn. Theo mặc định, sed in ra mọi dòng mà nó xử lý, điều này có thể gây khó khăn khi làm việc với các tệp nhật ký hoặc cấu hình lớn. Để kiểm soát điều này, bạn cần sử dụng tùy chọn -n kết hợp với lệnh p (print).
3. Hiển thị và trích xuất nội dung
Bạn có thể sử dụng các lệnh dưới đây để trích xuất các phần cụ thể của tệp:
- In một dòng cụ thể: Sử dụng lệnh sau để hiển thị dòng thứ 5 của tệp:
sed -n '5p' file.txt
- In một phạm vi dòng: Để in các dòng từ 15 đến 20, bạn chỉ cần chỉ định phạm vi đó:
sed -n '15,20p' file.txt
- In các dòng chứa từ khóa: Lệnh này sẽ tìm kiếm và chỉ in ra những dòng có chứa từ ERROR. Nó hoạt động tương tự như lệnh grep nhưng được tích hợp trực tiếp trong sed:
sed -n '/ERROR/p' file.txt
- Trích xuất khối văn bản: Đây là một tính năng mạnh mẽ, cho phép bạn trích xuất tất cả các dòng nằm giữa hai từ khóa cụ thể. Ví dụ, để lấy toàn bộ nội dung từ START đến END:
sed -n '/START/,/END/p' file.txt
- Đảo ngược kết quả: Nếu bạn muốn in tất cả các dòng ngoại trừ những dòng chứa từ khóa, hãy sử dụng tùy chọn !. Lệnh dưới đây sẽ in tất cả các dòng trừ những dòng có chứa từ ERROR:
sed -n '/ERROR/!p' logfile.txt
Những lệnh này giúp bạn dễ dàng tập trung vào dữ liệu quan trọng và loại bỏ những thông tin nhiễu, làm cho quá trình gỡ lỗi và phân tích trở nên nhanh chóng hơn.
Bạn có muốn tìm hiểu thêm về cách kết hợp sed với các lệnh Linux khác không?
4. Chỉnh sửa tệp tại chỗ và tạo bản sao lưu
Theo mặc định, mọi thao tác của lệnh sed
đều an toàn vì nó chỉ in kết quả ra terminal và không làm thay đổi tệp gốc. Tuy nhiên, đôi khi bạn cần thực hiện các thay đổi vĩnh viễn. Để làm điều này, bạn sử dụng tùy chọn -i
(viết tắt của in-place – tại chỗ).
sed -i 's/old/new/g' file.txt
Lệnh này sẽ thay thế mọi trường hợp của từ old
bằng từ new
trực tiếp trong tệp văn bản của bạn, không cần chuyển hướng hay tạo thêm tệp mới. Tuy nhiên, có một lưu ý quan trọng: thao tác này ghi đè lên tệp ngay lập tức và không có nút hoàn tác.
Để đảm bảo an toàn, bạn nên tạo một bản sao lưu của tệp gốc. Để làm điều này, hãy sử dụng tùy chọn -i
kèm theo một hậu tố (suffix) cho bản sao lưu:
sed -i.bak 's/old/new/g' file.txt
Lệnh trên sẽ tạo một bản sao của tệp gốc với tên là file.txt.bak
trước khi thực hiện chỉnh sửa. Nếu có bất kỳ lỗi nào xảy ra, bạn có thể nhanh chóng khôi phục lại tệp ban đầu.
Bạn cũng có thể chọn hậu tố tùy chỉnh cho bản sao lưu:
sed -i.backup 's/temporary/permanent/g' file.txt
Một mẹo hữu ích là sử dụng dấu thời gian làm hậu tố để dễ dàng theo dõi các phiên bản tệp theo ngày:
sed -i.$(date +%Y%m%d) 's/foo/bar/g' config.conf
Lệnh này sẽ tạo ra một bản sao lưu được đánh dấu thời gian (ví dụ: config.conf.20250912
), giúp bạn dễ dàng truy vết các phiên bản tệp được chỉnh sửa vào những ngày cụ thể.
Dưới đây là bản dịch tiếng Việt cho đoạn văn bạn đã cung cấp, trình bày theo phong cách chuyên nghiệp và dễ hiểu.
5. Áp dụng nhiều thay đổi cùng một lúc
Khi cần thực hiện nhiều thay đổi—chẳng hạn như làm sạch dữ liệu, chuẩn hóa nhãn, hoặc điều chỉnh tệp cấu hình—việc chạy lệnh sed
nhiều lần là không hiệu quả. Thay vào đó, bạn có thể gộp các thao tác chỉnh sửa lại với nhau để tệp chỉ cần được quét một lần duy nhất.
Để thực hiện hai thay thế trong một lần chạy, bạn có thể sử dụng nhiều cờ -e
:
sed -i -e 's/apple/orange/g' -e 's/pear/grape/g' file.txt
Lệnh này sẽ thay thế từ apple thành orange và pear thành grape trong tệp.
Một cách khác gọn hơn là xếp chồng các lệnh trong một chuỗi duy nhất, phân tách bằng dấu chấm phẩy:
sed 's/red/blue/g; s/apple/orange/g; /draft/d' data.txt
Phiên bản này sẽ thay thế màu sắc, hoán đổi tên trái cây và xóa bất kỳ dòng nào có chứa từ draft. Mặc dù cách này hoạt động hiệu quả, nhưng khi số lượng lệnh tăng lên, tính dễ đọc của mã sẽ giảm đi. Khi đó, việc chuyển các lệnh vào một tệp script riêng sẽ là giải pháp tối ưu hơn.
Bạn có muốn tìm hiểu về cách sử dụng tệp script để tự động hóa các chỉnh sửa này không?
6. Tự động hóa chỉnh sửa bằng script
Đầu tiên, hãy tạo một tệp script (ví dụ: edits.sed
) và thêm các lệnh chỉnh sửa vào đó. Mỗi lệnh sẽ nằm trên một dòng riêng biệt.
Ví dụ, tệp edits.sed
của bạn có thể chứa các dòng sau:
s/apple/orange/g s/pear/grape/g /^#/d
Khi đã có tệp script này, bạn có thể chạy tất cả các lệnh cùng một lúc bằng cách sử dụng tùy chọn -f
(viết tắt của file – tệp):
sed -i -f edits.sed file.txt
Chỉ với một lệnh duy nhất, sed
sẽ áp dụng tất cả các chỉnh sửa được định nghĩa trong edits.sed
cho tệp file.txt
một cách nhanh chóng. Tuy nhiên, bạn sẽ cần dành thời gian ban đầu để tạo ra các quy tắc chỉnh sửa phù hợp trong tệp edits.sed
cho các tệp bạn muốn sửa đổi.
7. Chỉnh sửa văn bản bằng cách tận dụng biểu thức chính quy (Regex)
Biểu thức chính quy (Regex) mô tả các mẫu (patterns) thay vì các văn bản cố định. Điều này cho phép bạn nhắm mục tiêu các hình dạng dữ liệu, chẳng hạn như một từ theo sau là một số hoặc bất kỳ văn bản nào ở cuối dòng, thay vì chỉ các từ chính xác. Ban đầu, regex có vẻ đáng sợ, nhưng một khi bạn nắm vững một vài kiến thức cơ bản, nó sẽ giống như một “con dao quân đội Thụy Sĩ” giúp bạn thao tác văn bản.
Regex không chỉ dùng để làm sạch văn bản mà còn giúp bạn phát hiện các mẫu và định hình cách bạn làm việc với dữ liệu. Một số ký hiệu quan trọng bao gồm:
^
và$
khớp với văn bản ở đầu hoặc cuối dòng.- Dấu ngoặc vuông như
[0-9]
khớp với bất kỳ chữ số nào, và[aeiouAEIOU]
giúp bạn tìm hoặc xóa các nguyên âm. - Dấu chấm
.
đại diện cho bất kỳ một ký tự nào. *
và+
cho phép bạn lặp lại các mẫu nhiều lần tùy ý.
Regex có thể rất chuyên sâu, nhưng ngay cả khi chỉ học một vài kiến thức cơ bản, bạn cũng có thể mở ra nhiều khả năng với các công cụ như sed
.
Hãy xem xét lệnh này, dùng để đảo ngược họ và tên:
sed -E 's/^([A-Za-z]+)[[:space:]]+([A-Za-z]+)$/\2, \1/' names.txt
Nếu tệp của bạn có nội dung:
John Doe
Jane Smith
Thì đầu ra sẽ là:
Doe, John
Smith, Jane
Regex cũng giải quyết các vấn đề về tính nhất quán, như thêm số 0 vào trước các chữ số đơn lẻ hoặc xóa các khoảng trắng thừa ở cuối dòng trong các tệp nhật ký và CSV:
sed -E ‘s/\b([0-9])\b/0\1/g’ numbers.txt #add a leading zero
sed -E ‘s/[[:space:]]+$//’ file.txt #removing trailing spaces
8. Làm sạch và định dạng tệp văn bản
Các tệp văn bản lộn xộn rất phổ biến, đặc biệt là khi chúng được tạo ra từ các hệ thống Windows, Excel hoặc các chương trình xuất dữ liệu tự động. Lệnh sed có thể nhanh chóng làm sạch dữ liệu đó, giúp bạn dễ dàng đọc, chia sẻ hoặc sử dụng chúng trong các script.
Một ví dụ điển hình là việc xử lý các ký tự xuống dòng của Windows. Nếu bạn mở một tệp Windows trên Linux và thấy các ký tự ^M
lạ, đó chính là ký tự xuống dòng carriage return (\r
). Bạn có thể loại bỏ ký tự này ở cuối mỗi dòng bằng lệnh:
sed -i 's/\r$//' file.txt
Các ký tự tab cũng là một phiền toái phổ biến. Để chuẩn hóa tất cả các tab thành khoảng trắng, bạn có thể sử dụng lệnh:
sed -E 's/\t/ /g' file.txt
Ngoài ra, khoảng trắng không mong muốn có thể xuất hiện ở khắp mọi nơi—dòng trống, khoảng trắng thừa ở cuối dòng, hoặc khoảng cách không nhất quán giữa các từ. sed xử lý những vấn đề này một cách dễ dàng với các lệnh sau:
sed -E '/^[[:space:]]*$/d' file.txt sed -E 's/[[:space:]]+$//' file.txt sed -E 's/[[:space:]]+/ /g' file.txt
Lệnh đầu tiên sẽ xóa các dòng trống. Lệnh thứ hai loại bỏ khoảng trắng thừa ở cuối mỗi dòng. Lệnh cuối cùng nén nhiều khoảng trắng thành một khoảng trắng duy nhất, tạo ra một văn bản gọn gàng và đồng nhất.
9. Kết hợp với các lệnh khác
Một trong những ưu điểm lớn của sed
là khả năng làm việc mượt mà với các lệnh Bash khác. Bạn có thể tận dụng nó để cắt tỉa đầu ra, trích xuất thông tin, so sánh các tệp đã xử lý và áp dụng chỉnh sửa trên nhiều tệp cùng lúc—tất cả chỉ bằng những dòng lệnh đơn giản hoặc trong các script lớn hơn.
Ví dụ, lệnh ps aux
thường in ra quá nhiều thông tin. Bằng cách kết hợp nó với sed
thông qua piping (|
), bạn có thể chỉ giữ lại 5 dòng đầu tiên:
ps aux | sed -n '1,5p'
Bạn cũng có thể kết hợp grep
và sed
để trích xuất thông tin cụ thể. Chẳng hạn, nếu bạn có một tệp nhật ký chứa đầy các thông báo lỗi có dấu thời gian trong ngoặc vuông, bạn có thể sử dụng lệnh sau để chỉ trích xuất các dấu thời gian đó:
grep 'ERROR' logfile | sed -E 's/.*\[([0-9-: ]+)\].*/\1/p'
Đây chỉ là một vài ví dụ. Bạn có thể kết hợp sed
với các lệnh khác như diff
, find
, xargs
, và nhiều lệnh khác nữa. Nó giúp định hình lại các luồng văn bản phức tạp để lệnh tiếp theo có thể hoạt động hiệu quả hơn.
Từ các thao tác tìm và thay thế đơn giản đến các biến đổi phức tạp dựa trên regex, sed
cung cấp các giải pháp giúp tiết kiệm vô số giờ làm việc thủ công. Tuy nhiên, giống như bất kỳ lệnh Linux nào khác, chìa khóa để thành thạo nó là thực hành hàng ngày. Sử dụng nó thường xuyên và nó sẽ sớm trở thành bản năng thứ hai của bạn.
10. Kết luận
Lệnh sed trên Linux là một công cụ mạnh mẽ và linh hoạt, giúp bạn chỉnh sửa văn bản một cách nhanh chóng và hiệu quả. Với 9 cách sử dụng được hướng dẫn chi tiết trong bài viết, bạn có thể dễ dàng thao tác với các tệp văn bản, từ thay thế chuỗi, xóa dòng, đến xử lý dữ liệu phức tạp. Việc thành thạo sed không chỉ tiết kiệm thời gian mà còn nâng cao kỹ năng quản lý hệ thống của bạn.
Xem thêm: Hướng dẫn chi tiết cách đặt lại cài đặt Google Chrome về mặc định
Nếu bạn cần thêm tài nguyên học tập, phần mềm công nghệ hoặc hỗ trợ chuyên sâu về Linux, hãy ghé thăm COHOTECH – cửa hàng cung cấp các giải pháp công nghệ tiên tiến và dịch vụ tận tâm, luôn sẵn sàng đồng hành cùng bạn trong hành trình khám phá công nghệ. Hãy để lại bình luận bên dưới để chia sẻ trải nghiệm, mẹo hay hoặc câu hỏi của bạn về lệnh sed. Đừng quên chia sẻ bài viết này đến cộng đồng yêu công nghệ để cùng nhau học hỏi và phát triển! Cảm ơn bạn đã đọc và ủng hộ!