Cách sử dụng sed để tìm và thay thế văn bản trong tệp ở Linux/Unix

Tác giả: 17/01/2023

Cú pháp sed hay stream editor cho phép đọc nội dung tệp và thay đổi nội dung tùy vào cách sử dụng.

Trong bài viết này, hãy cùng Nhân Hòa tìm hiểu những ví dụ cơ bản nhất về cách sử dụng sed.

Tìm và thay thế nội dung tệp với lệnh sed

Cú pháp cơ bản để sử dụng sed như sau:

sed -i 's/"<old_text>"/"<new_text>"/g' file.txt

Một vài cách sử dụng khác:

# Trong BSD/macOS
sed 's/word1/word2/g' input.file > output.file
# Trong GNU/Linux
sed -i 's/word1/word2/g' input.file
sed -i -e 's/word1/word2/g' -e 's/xx/yy/g' input.file
# Có thể sử dụng dấu + thay vì /
sed -i 's+regex+new-text+g' file.txt

Tất cả các cú pháp trên sẽ thay thế phần <old_text> được tìm thấy trong văn bản thành <new_text>

Ví dụ: Đầu tiên ta kiểm tra nội dung văn bản

cat nhanhoa.txt

Đầu ra:

Day la dong thu 1
Day la dong thu 2
Day la dong thu 3

Sử dụng sed:

sed 's/dong/line/g' nhanhoa.txt

Đầu ra:

Day la line thu 1
Day la line thu 2
Day la line thu 3

Để thay đổi luôn nội dung file, ta phải sử dụng thêm tùy chọn -i:

sed -i 's/dong/line/g' nhanhoa.txt

Lưu ý ký tự g ở cuối chỉ định toàn bộ lần xuất hiện của “dong” đều sẽ bị thay thế, nếu không có ký tự này, chỉ ký tự “dong” đầu tiên bị thay thế.

Để không phân biệt chữ hoa chữ thường, ta thêm ký tự I (chữ I viết hoa) ở cuối như sau:

sed -i 's/dong/line/gI' nhanhoa.txt

Một vài lưu ý về sed trong *BSD và macOS

Trên các bản phân phối *BSD (FreeBSD, OpenBSD, NetBSD) và MacOS không hề hỗ trợ phân biệt chữ hoa chữ thường cũng như chỉnh sửa file với tùy chọn -i. Do đó, bạn cần phải cài đặt thêm gnu sed. Chạy lệnh sau:

brew install gnu-sed
# Sau đó sử dụng lệnh gsed như sau:
gsed -i 's/dong/line/gI' nhanhoa.txt
# Tạo 1 bản sao rồi mới chỉnh sửa:
gsed -i'.BAK' 's/dong/line/gI' nhanhoa.txt

Một vài vấn đề khác về sed

Ví dụ ta có 1 file với nội dung như sau:

http://
Công ty TNHH Phần mềm Nhân Hòa

Vậy nếu ta muốn thay http:// bằng https://nhanhoa.com ta sẽ dùng cú pháp như sau:

sed -i ‘s/http:///https://www.nhanhoa.com/g’ nhanhoa.txt 

Tuy nhiên cú pháp bên trên sẽ trả về lỗi “bad flag in subtitute command”

Để khắc phục, ta có thể đơn giản dùng 1 dấu phân cách khác như:

sed -i ‘s+http://+https://www.nhanhoa.com+g’ nhanhoa.txt 

Một ví dụ khác, vẫn sử dụng file nhanhoa.txt như trên, nhưng giờ ta muốn thay đổi chữ “dong” ở dòng thứ 2. Vậy có thể sử dụng cú pháp sau:

sed -i -e '/2/s/"dong"/"line"/' input.txt

Theo đó, nếu dòng chứa chữ dong mà có xuất hiện số 2 thì sẽ được thay thế bằng line

 

Tổng kết

Qua bài viết này, Nhân Hòa đã giới thiệu về cách sử dụng cơ bản nhất của sed để tìm và thay thế văn bản trong tệp. Đừng quên ghé qua man page của lệnh sed để hiểu rõ hơn. Cũng như theo dõi các bài viết tiếp theo của Nhân Hòa tại Wiki Nhân Hòa.

Chúc các bạn luôn may mắn và thành công trong công việc!

Trả lời