Lệnh sed trong UNIX có thể dùng để thực hiện nhiều thao tác với file như tìm kiếm, thay thế, chèn và xóa nội dung. Bài viết này sẽ hướng dẫn cách sử dụng lệnh sed
trong Linux hiệu quả nhất.
Lệnh sed trong Linux là gì?
Sed (Stream Editor) là một công cụ mạnh mẽ trong Linux để xử lý văn bản theo dòng. Sed được sử dụng để tìm kiếm, thay thế, xóa, thêm, trích xuất và thao tác dữ liệu văn bản một cách hiệu quả.
Cấu trúc cơ bản của lệnh sed
:
sed 'scripte' [tệp_đầu_vào]
scripte
: Chuỗi lệnhsed
để thực hiện thao tác.tệp_đầu_vào
: Tệp văn bản mà bạn muốn xử lý. Nếu không được chỉ định,sed
sẽ đọc dữ liệu từ đầu vào chuẩn.
Cách sử dụng lệnh sed trong Linux
Sed cho phép thay đổi nội dung file mà không cần mở file. Bên cạnh đó, lệnh sed
còn hỗ trợ biểu thức chính quy để so sánh và khớp các mẫu văn bản phức tạp.
Lệnh sed
có cú pháp chung như sau:
sed OPTIONS... [SCRIPT] [INPUTFILE...]
Giả sử ta có file sau làm input cho các ví dụ ở dưới đây:
$cat > geekfile.txt
Nội dung:
unix is great os. unix is opensource. unix is free os.
learn operating system.
unix linux which one you choose.
unix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.
Thay thế một chuỗi
Đây cũng là mục đích sử dụng phổ biến nhất của lệnh Sed trong Linux. Giả sử ta cần thay từ “unix” trong file thành “linux“:
$sed 's/unix/linux/' geekfile.txt
Output:
linux is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.
Trong đó, s chỉ định sử dụng thao tác thay thế (substitute), / là ký tự phân cách, unix là mẫu tìm kiếm còn linux là xâu để thay thế. Theo mặc định thì lệnh sed chỉ thay thế mẫu đầu tiên tìm được trong mỗi dòng. Vì vậy dòng đầu tiên chỉ có xâu “unix” đầu tiên là bị thay thế thành “linux“.
Xem thêm: Tổng hợp 37 câu lệnh cơ bản trong Linux
Thay thế lần xuất hiện thứ n của một mẫu trong dòng
Nếu muốn thay thế mẫu khớp được thứ nhất, thứ hai,… trong dòng thì ta có thể dùng các flag /1
, /2
,… tương ứng. Giả sử ta cần thay thế từ “unix” thành “linux” trong dòng, nhưng chỉ thay thế lần xuất hiện thứ hai của xâu này:
$sed 's/unix/linux/2' geekfile.txt
Output:
unix is great os. linux is opensource. unix is free os.
learn operating system.
unix linux which one you choose.
unix is easy to learn.linux is a multiuser os.Learn unix .unix is a powerful.
Thay thế mọi xâu khớp được trong dòng
Để thay thế mọi xâu khớp được trong dòng, ta có thể dùng flag /g
(global) trong lệnh sed:
$sed 's/unix/linux/g' geekfile.txt
Output:
linux is great os. linux is opensource. linux is free os.
learn operating system.
linux linux which one you choose.
linux is easy to learn.linux is a multiuser os.Learn linux .linux is a powerful.
Thay thế xâu kể từ lần xuất hiện thứ n trong dòng
Giả sử ta muốn thay thế các xâu khớp được bằng một xâu khác, nhưng chỉ thay thế kể từ một lần xuất hiện nhất định của xâu thì có thê kết hợp các flag /1
, /2
,… và /g như sau:
$sed 's/unix/linux/3g' geekfile.txt
Lệnh trên có tác dụng thay thế xâu “unix” thành “linux“, kể từ lần xuất hiện từ ba, bốn, năm,… của xâu trong dòng.
Output:
unix is great os. unix is opensource. linux is free os.
learn operating system.
unix linux which one you choose.
unix is easy to learn.unix is a multiuser os.Learn linux .linux is a powerful.
Đưa ký tự đầu tiên của mỗi từ vào ngoặc
$ echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g'
Output:
(W)elcome (T)o (T)he (G)eek (S)tuff
Thay thế xâu ở một dòng nhất định
Ta có thể yêu cầu lệnh sed thay thế một xâu trên một dòng nhất định bằng cách chỉ định số thứ tự của dòng như sau:
$sed '3 s/unix/linux/' geekfile.txt # thay thế trên dòng thứ 3
Output:
unix is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
unix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.
Nhân bản dòng được thay thế
Flag /p cho phép in ra hai lần dòng vừa được thay thế:
$sed 's/unix/linux/p' geekfile.txt
Output:
linux is great os. unix is opensource. unix is free os.
linux is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
linux linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.
Chỉ hiện thị các dòng được thay thế
Kết hợp option -n và flag /p giúp ta chỉ in ra những dòng được thay thế theo lệnh sed trong Linux:
$sed -n 's/unix/linux/p' geekfile.txt
Output:
linux is great os. unix is opensource. unix is free os.
linux linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.
Ở đây, option -n đã bỏ các dòng bị trùng lặp khi sử dụng flag /p, do đó chỉ in ra những dòng bị thay thế ra terminal. Nếu chỉ dùng option -n thì lệnh sed sẽ không hiển thị gì.
Thay thế xâu trên một khoảng dòng xác định
Giả sử ta cần thay thế các xâu ở dòng 1 đến dòng 3:
$sed '1,3 s/unix/linux/' geekfile.txt
Output:
linux is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
unix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful.
Hoặc từ dòng 2 đến cuối file (ký tự $ để đánh dấu vị trí dòng cuối cùng của file):
$sed '2,$ s/unix/linux/' geekfile.txt
Output:
unix is great os. unix is opensource. unix is free os.
learn operating system.
linux linux which one you choose.
linux is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful
Xóa dòng từ một file xác định
Lệnh sed
có thể được dùng để xóa các dòng có trong file mà không cần phải mở file đó lên. Ví dụ:
- Xóa dòng thứ n trong file, cú pháp:
<br>$ sed 'nd' filename.txt
Ví dụ xóa dòng thứ 5 trong file:
$ sed '5d' filename.txt
- Xóa dòng cuối cùng của file:
$ sed '$d' filename.txt
- Xóa các dòng từ vị trí thứ x đến y, cú pháp:
$ sed 'x,yd' filename.txt
Ví dụ xóa từ dòng 3 đến 6 trong file:
$ sed '3,6d' filename.txt
- Xóa từ dòng thứ n đến cuối file:
$ sed 'nth,$d' filename.txt
Ví dụ xóa từ dòng thứ 12 trở đi:
$ sed '12,$d' filename.txt
- Xóa dòng có khớp mẫu:
$ sed '/pattern/d' filename.txt
Ví dụ:
$ sed '/abc/d' filename.txt
Một số lệnh sed thường dùng
d
: Xóa dòng hiện tại.q
: Thoát khỏi sed.s/…/…/g
: Tìm kiếm và thay thế tất cả sự xuất hiện của mẫu đầu tiên (“…”) bằng mẫu thứ hai (“…”) trong dòng hiện tại.s/…/…/n
: Tìm kiếm và thay thế sự xuất hiện đầu tiên của mẫu đầu tiên (“…”) bằng mẫu thứ hai (“…”) trong dòng hiện tại.p
: In ra dòng hiện tại.a
: Thêm dòng mới sau dòng hiện tại.i
: Thêm dòng mới trước dòng hiện tại.N
: Append dòng tiếp theo vào dòng hiện tại.
Lời kết
Bài viết này đã liệt kê một số trường hợp sử dụng phổ biến nhất của lệnh sed trong Linux, giúp ta chỉnh sửa, tìm kiếm nội dung mà không cần phải mở file. Nếu có câu hỏi gì về lệnh sed trong Linux thì bạn đọc hãy để lại ở phần comment bên dưới nhé!