CodeGym /Các khóa học /Docker SELF /Chuyển đổi văn bản với sed

Chuyển đổi văn bản với sed

Docker SELF
Mức độ , Bài học
Có sẵn

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ằng sed 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.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION