Chuyển đổi văn bản với sed
1. Cú pháp lệnh sed
sed
là gì?
sed
(viết tắt của Stream Editor, tức là trình biên tập dòng) — là một công cụ mạnh mẽ để xử lý văn bản, cho phép thay đổi, thêm, xóa hoặc chuyển đổi các dòng trong tệp văn bản và luồng dữ liệu.
Điều kỳ diệu của sed
nằm ở chỗ nó chỉnh sửa văn bản "trong thời gian thực", không làm ảnh hưởng đến tệp gốc (trừ khi bạn yêu cầu). Điều này làm cho nó trở thành một công cụ lý tưởng để chuyển đổi dữ liệu nhanh chóng và tự động.
Cú pháp chính của lệnh
Hãy lấy công thức chính để làm việc với sed
:
sed [tùy chọn] 'mẫu/hành động' file
Trong đó:
mẫu
— là văn bản hoặc biểu thức chính quy mà bạn muốn tìm kiếm.hành động
— thao tác bạn muốn thực hiện (ví dụ: thay thế văn bản).file
— tệp văn bản chứa các dòng mà bạn muốn chỉnh sửa.
Để bắt đầu, chúng ta sẽ tập trung vào các hành động phổ biến nhất: thay thế văn bản (s
— từ "substitute") và xóa dòng (d
— từ "delete").
2. Thay thế văn bản s/cũ/mới/
Ví dụ 1: Thay thế văn bản cơ bản
Giả sử chúng ta có file example.txt
với nội dung:
Hello world!
Welcome to Linux.
Linux is awesome.
Hãy thử thay thế từ "Linux" thành sed
:
sed 's/Linux/sed/' example.txt
Kết quả sẽ như sau:
Hello world!
Welcome to sed.
sed is awesome.
Vậy là xong. Từ "Linux" chỉ được thay thế một lần trên mỗi dòng. Đây là hành vi mặc định.
Ví dụ 2: Thay thế toàn bộ
Nếu muốn thay thế tất cả các lần xuất hiện của từ thay vì chỉ lần đầu tiên trên dòng, thêm cờ g
(toàn bộ):
sed 's/Linux/sed/g' example.txt
Nếu trên dòng có nhiều lần đề cập đến "Linux", tất cả sẽ được thay thế bằng sed
.
Ví dụ 3: Bỏ qua phân biệt chữ hoa/chữ thường
Để thay thế văn bản mà không phân biệt chữ hoa/chữ thường, thêm cờ I
(hoặc i
tùy thuộc vào phiên bản của bạn):
sed 's/linux/sed/gi' example.txt
Điều này sẽ thay thế các từ "Linux", "LINUX", "LiNuX", v.v.
Ví dụ 4: Thay thế và ghi kết quả
Theo mặc định sed
chỉ in kết quả ra console, không thay đổi file. Nếu bạn muốn lưu thay đổi trở lại file, thêm tùy chọn -i
(in-place):
sed -i 's/Linux/sed/g' example.txt
Bây giờ file example.txt
sẽ được cập nhật với các thay đổi.
3. Xóa dòng /mẫu/d
Ví dụ 1: Xóa dòng theo mẫu
Nếu bạn muốn xóa tất cả các dòng chứa từ "Linux":
sed '/Linux/d' example.txt
Đầu ra sẽ như sau:
Hello world!
Ở đây các dòng có "Linux" đã bị xóa.
Xóa dòng theo số
Bạn có thể xóa dòng theo số thứ tự của nó. Ví dụ, để xóa dòng thứ hai, sử dụng:
sed '2d' example.txt
Đầu ra:
Hello world!
Linux is awesome.
Xóa nhiều dòng: chỉ định một phạm vi, ví dụ như xóa dòng từ thứ 2 đến thứ 3:
sed '2,3d' example.txt
4. Làm việc với biểu thức chính quy
Đây là nơi sed
thể hiện uy lực của mình! Trong các mẫu, có thể sử dụng biểu thức chính quy để tìm kiếm các kết quả phức tạp hơn.
Ví dụ 1: Thay thế từ với một mẫu cụ thể
Giả sử, trong văn bản có các dòng:
error: something went wrong
warning: check your system
error: unable to connect
Chúng ta muốn thay thế tất cả các dòng bắt đầu bằng "error", bằng "Issue Detected". Biểu thức chính quy sẽ giúp làm điều này:
sed 's/^error:.*/Issue Detected/' logs.txt
Ở đây:
^
— chỉ ra bắt đầu của dòng..*
— có nghĩa là "bất kỳ nội dung nào phía sau".
Kết quả:
Issue Detected
warning: check your system
Issue Detected
5. Thêm và chèn dòng
Chèn dòng trước khi khớp
Để chèn dòng trước mỗi dòng chứa "Linux":
sed '/Linux/i\# Học tập thật thú vị' example.txt
Kết quả:
Hello world!
Welcome to Linux.
# Học tập thật thú vị
Linux is awesome.
Ví dụ 2: Thêm dòng sau khi khớp
Để thêm văn bản sau dòng với mẫu:
sed '/Linux/a\# sed làm cho mọi thứ dễ dàng hơn' example.txt
Kết quả:
Hello world!
Welcome to Linux.
# sed làm cho mọi thứ dễ dàng hơn
Linux is awesome.
# sed làm cho mọi thứ dễ dàng hơn
6. Thực hành: xử lý file cấu hình
Hãy thử giải quyết một bài toán thực tế. Giả sử bạn có một file cấu hình config.txt
:
host=localhost
port=8080
mode=production
logfile=/var/log/app.log
Bài toán 1: Thay "localhost" bằng "127.0.0.1"
sed -i 's/localhost/127.0.0.1/' config.txt
Kết quả:
host=127.0.0.1
port=8080
mode=production
logfile=/var/log/app.log
Bài toán 2: Tăng port lên 1
Để làm điều này, chúng ta sẽ sử dụng sed
với một mẹo nhỏ:
sed -i 's/port=8080/port=8081/' config.txt
Kết quả:
host=127.0.0.1
port=8081
mode=production
logfile=/var/log/app.log
Bài toán 3: Xóa dòng có logfile
Nếu cấu hình không còn yêu cầu ghi log nữa, chúng ta xóa dòng này:
sed -i '/logfile/d' config.txt
Kết quả:
host=127.0.0.1
port=8081
mode=production
7. Kết hợp với các lệnh khác
sed
hoạt động tuyệt vời khi kết hợp với các công cụ khác trên Linux. Ví dụ:
grep "error" logs.txt | sed 's/error/ERROR/'
Ở đây, đầu tiên chúng ta tìm các dòng có lỗi, sau đó định dạng chúng lại.
Lỗi thường gặp và cách tránh
- Lỗi: quên tùy chọn
-i
. Người mới thường nghĩ rằngsed
sẽ thay đổi tệp, nhưng lại quên thêm-i
. Đừng quên chỉ rõ điều này nếu bạn muốn sửa đổi tệp. - Lỗi: dấu ngoặc kép. Trên một số hệ thống, đặc biệt khi sử dụng dấu ngoặc đơn,
\
trước ký tự đặc biệt có thể hoạt động không chính xác. Hãy luôn thoát ký tự đúng cách. - Lỗi với phạm vi dòng. Nếu bạn sử dụng phạm vi (ví dụ:
2,3d
), hãy đảm bảo rằng chúng được đặt chính xác — tệp không nên bị rỗng.
GO TO FULL VERSION