Sử dụng sed để tìm và thay thế chuỗi trong tệp tin Linux

Lệnh sed (stream editor) trong hệ điều hành Linux là một công cụ mạnh mẽ để xử lý văn bản theo luồng, cho phép thực hiện các thao tác chỉnh sửa tự động như tìm kiếm, thay thế, chèn, xóa hoặc thay đổi nội dung tệp mà không cần mở trình soạn thảo tương tác.

Cú pháp cơ bản

sed [tùy_chọn] 'lệnh' [tệp_mục_tiêu]

Một số tùy chọn phổ biến:

  • -i: Chỉnh sửa trực tiếp trên tệp gốc (in-place edit). Có thể kèm hậu tố để sao lưu bản gốc, ví dụ -i.bak.
  • -e: Chỉ định một lệnh sed (hữu ích khi kết hợp nhiều lệnh).
  • -f: Đọc tập hợp lệnh từ một tệp script bên ngoài.
  • -n: Chỉ in ra dòng được xử lý bởi lệnh p, ẩn đầu ra mặc định.

Các lệnh phổ biến trong sed:

  • s/old/new/g: Thay thế toàn bộ xuất hiện của old bằng new trên mỗi dòng (g = global).
  • /pattern/d: Xóa các dòng khớp với biểu thức chính quy pattern.
  • /pattern/p: In các dòng khớp (kết hợp với -n để chỉ hiển thị dòng được chọn).
  • a\text: Thêm dòng text sau dòng hiện tại.
  • i\text: Chèn dòng text trước dòng hiện tại.

Ví dụ minh họa

Giả sử có tệp config.ini với nội dung:

topic_dir = TEMPLATE_TOPICS
index_path = TEMPLATE_INDEX
cache_ttl = 300

1. Thay thế đơn giản:

sed 's/TEMPLATE_TOPICS/app_topics/g' config.ini

Kết quả đầu ra (không thay đổi tệp gốc):

topic_dir = app_topics
index_path = TEMPLATE_INDEX
cache_ttl = 300

2. Thay thế nhiều mẫu trong một lệnh:

sed -e 's/TEMPLATE_TOPICS/app_topics/g' \
    -e 's/TEMPLATE_INDEX/main_index/g' \
    config.ini

Hoặc viết gọn trên một dòng bằng dấu chấm phẩy:

sed 's/TEMPLATE_TOPICS/app_topics/g; s/TEMPLATE_INDEX/main_index/g' config.ini

3. Ghi đè trực tiếp vào tệp:

sed -i 's/TEMPLATE_TOPICS/app_topics/g' config.ini

Để giữ bản sao gốc, dùng:

sed -i.bak 's/TEMPLATE_TOPICS/app_topics/g' config.ini

→ Tạo tệp sao lưu config.ini.bak, đồng thời cập nhật nội dung gốc.

4. Sử dụng tệp script riêng:

Tạo tệp replace.sed:

s/TEMPLATE_TOPICS/app_topics/g
s/TEMPLATE_INDEX/main_index/g
/backup_mode/d

Áp dụng bằng:

sed -f replace.sed config.ini > updated.ini

Hoặc ghi đè:

sed -i -f replace.sed config.ini

Lưu ý: Ký tự gạch chéo / trong biểu thức thay thế có thể được thay bằng ký tự khác (như | hoặc #) để tránh xung đột với đường dẫn hoặc URL:

sed 's|/usr/local|/opt|g' paths.txt

Thẻ: sed linux shell-scripting regular-expressions text-processing

Đăng vào ngày 19 tháng 5 lúc 20:36