Bài viết này giới thiệu các bạn cách dùng lệnh sed
trên hệ điều hành Linux.
1. Lệnh sed
Lệnh sed
là công cụ xử lý văn bản mạnh mẽ và là một tiện ích UNIX lâu đời nhất và phổ biến nhất. Nó được sử dụng để sửa đổi nội dung của một tệp, thường đặt nội dung vào một tệp mới.
Lệnh sed
có thể lọc văn bản, cũng như thực hiện thay thế trong luồng dữ liệu.
Dữ liệu từ một nguồn/tệp đầu vào được lấy và di chuyển đến không gian làm việc. Toàn bộ danh sách các hoạt động/sửa đổi được áp dụng trên dữ liệu trong không gian làm việc và nội dung cuối cùng được chuyển đến không gian đầu ra tiêu chuẩn.
1.1. Cách sử dụng cơ bản
Thông thường lệnh sed
hoạt động trên một luồng dữ liệu được đọc từ đầu vào chuẩn hoặc một file văn bản. Lệnh sed
sẽ hiển thị kết quả ra màng hình, trừ khi có sự chuyển hướng kết quả này. Cú pháp cơ bản của lệnh sed
:
sed [tùy chọn] commands [file]
Để xem các tùy chọn của lệnh sed
chúng ta dùng: man sed
Chúng ta có thể gọi lệnh sed
bằng cú pháp trong bảng sau đây:
Lệnh | Chức năng |
---|---|
sed -e command filename | Chỉ định các lệnh chỉnh sửa tại dòng lệnh, hoạt động trên tệp và đưa đầu ra ra ngoài. |
sed -f scriptfile filename | Chỉ định một scriptfile chứa lệnh sed, hoạt động trên tệp và đưa đầu ra ra ngoài. |
Chúng ta có thể thực hiện thao tác chỉnh sửa và lọc với lệnh sed
. Bảng giải thích một số thao tác cơ bản, trong đó mẫu là chuỗi hiện tại và thay chuỗi là chuỗi mới:
Lệnh | Chức năng |
---|---|
sed s/pattern/replace_string/ file | Thay thế chuỗi đầu tiên xuất hiện trong mỗi dòng |
sed s/pattern/replace_string/g file | Thay thế tất cả các lần xuất hiện trong mỗi dòng |
sed 1,3s/pattern/replace_string/g file | Thay thế tất cả các lần xuất hiện chuỗi trong một loạt các dòng |
sed -i s/pattern/replace_string/g file | Lưu các thay đổi để thay thế chuỗi trong cùng một tệp |
Lưu ý: Tùy chọn -i sử dụng một cách cẩn thận, vì không thể quay lại trạng thái trước khi thực hiện tuỳ chọn -i.
Để đảm bảo an toàn khi sử dụng lệnh sed
mà không có tùy chọn -i và sau đó thay thế tệp mới, như trong ví dụ sau:
sed s/pattern/replace_string/g file1 > file2
Lệnh trên sẽ thay thế tất cả các lần xuất hiện của pattern bằng replace_string trong file1 và di chuyển nội dung sang file2. Nội dung của file2 có thể được xem với lệnh cat file2
. Nếu kết quả file2 chính sác, chúng ta có thể ghi đè lên tệp gốc bằng lệnh mv file2 file1
.
2: Ví dụ về lệnh sed
Để hiều rõ hơn chức năng của lệnh sed
chúng ta thực hiện các ví dụ sau.
2.1: Tùy chọn lọc dòng
Theo mặc định, sẽ thực hiện trên toàn bộ tập tin. Thông thường, chúng ta chỉ cần trích xuất hoặc thay đổi các dòng cụ thể dựa trên tìm kiếm văn bản, số dòng,...
Lọc này là giống như sử dụng lệnh grep
, head
và tail
. Sử dụng lệnh sed
để chỉnh sửa tại chỗ, các dòng được lọc sẽ được chuyển đổi,...
Lệnh in
Được sử dụng với tùy chọn -n
Theo mặc định, lệnh sed
sẽ in mọi dòng đầu vào, bao gồm mọi thay đổi được thực hiện bởi các lệnh.
Sử dụng tùy chọn -n
và lệnh p
,lọc các dòng cụ thể
Ví dụ 1: Lệnh in(print)
[root@test1 ~]# cat filea.txt
Roses are red,
Violets are blue,
Sugar is sweet,
And so are you.
# tất cả các dòng chứa chuỗi "are"
[root@test1 ~]# sed -n '/are/p' filea.txt
Roses are red,
Violets are blue,
And so are you.
# tất cả các dòng chứa chuỗi "so are"
[root@test1 ~]# sed -n '/so are/p' filea.txt
And so are you.
Ví dụ 2: Sử dụng in và thay thế:
[root@test1 ~]# cat filea.txt
Roses are red,
Violets are blue,
Sugar is sweet,
And so are you.
[root@test1 ~]# sed -n 's/are/ARE/p' filea.txt
Roses ARE red,
Violets ARE blue,
And so ARE you.
[root@test1 ~]# sed -n '/are/ s/so/SO/p' filea.txt
And SO are you.
Ví dụ 3: Sao chép mọi dòng đầu vào:
[root@test1 ~]# seq 2 | sed 'p'
1
1
2
2
Ví dụ 4: Lọc theo số dòng
Sử dụng tùy chọn -n để lọc số dòng
[root@test1 ~]# cat poem.txt
Roses are red,
Violets are blue,
Sugar is sweet,
And so are you.
# in dòng 2
[root@test1 ~]# sed -n '2p' poem.txt
Violets are blue,
# in dòng 2 và dòng 4
[root@test1 ~]# sed -n '2p; 4p' poem.txt
Violets are blue,
And so are you.
[root@test1 ~]# sed -n '$p' poem.txt
And so are you.
# xóa từ dòng 3
[root@test1 ~]# sed '3!d' poem.txt
Sugar is sweet,
[root@test1 ~]# sed '2 s/are/ARE/' poem.txt
Roses are red,
Violets ARE blue,
Sugar is sweet,
And so are you.
2.2: Tìm kiếm và thay thế
Các ví dụ về lệnh tìm kiếm và thay thế được thực hiện qua như sau. Cú pháp là:
sed s/pattern/replace_string/ file
Lưu ý: Kí tự / được sử dụng như là một ký tự phân cách.
Ví dụ 1: Chỉnh sửa string
# đầu ra lệnh mẫu được chỉnh sửa
[root@test1 ~]# seq 15 | paste -sd,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
# chỉ thay đổi dấu phẩy đầu tiên
[root@test1 ~]# seq 15 | paste -sd, | sed 's/,/ : /'
1 : 2,3,4,5,6,7,8,9,10,11,12,13,14,15
# thay đổi tất cả "," thành dấu ":" bằng cách sử dụng công cụ sữa đổi "r"
[root@test1 ~]# seq 15 | paste -sd, | sed 's/,/ : /g'
1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 11 : 12 : 13 : 14 : 15
Ví dụ 2: Chỉnh sửa đầu vào tập tin
[root@test1 ~]# cat file.txt
Hello
Have a nice day
# thay đổi chữ 'e' đầu tiên của mỗi dòng thành 'E'
[root@test1 ~]# sed 's/e/E/' file.txt
HEllo
HavE a nice day
# thay đổi chữ 'nice day' của mỗi dòng thành 'safe journey'
[root@test1 ~]# sed 's/nice day/safe journey/' file.txt
Hello
Have a safe journey
# thay đổi chữ 'e' thành 'E' và lưu văn bản thành tệp mới
[root@test1 ~]# sed 's/e/E/g' file.txt > out.txt
[root@test1 ~]# cat out.txt
HEllo
HavE a nicE day
Ví dụ 3: Với bản sao lưu
[root@test1 ~]# cat file.txt
Hello
Have a nice day
# ".bkp" là phần mở rộng cung cấp
[root@test1 ~]# sed -i.bkp 's/Hello/Hi/' file.txt
# đầu ra sed là viết lại file.txt
[root@test1 ~]# cat file.txt
Hi
Have a nice day
# tệp gốc được lưu giữ trong file.txt.bkp
[root@test1 ~]# cat file.txt.bkp
Hello
Have a nice day
Ví dụ 4: Không có bản sao lưu
[root@test1 ~]# cat file.txt
Hello
Have a nice day
[root@test1 ~]# sed -i 's/nice day/safe journey/' file.txt
# "Hello" đã được đổi thành "Hi" trong ví dụ trước
[root@test1 ~]# cat file.txt
Hi
Have a safe journey
Ví dụ 5: Nhiều tập tin
[root@test1 ~]# cat file1
I ate 3 apples
[root@test1 ~]# cat file2
I bought tow bananas and 3 mangoes
[root@test1 ~]# sed -i 's/3/three/' file1 file2
[root@test1 ~]# cat file1
I ate three apples
[root@test1 ~]# cat file2
I bought tow bananas and three mangoes
Ví dụ 6: Tên bản sao lưu tiền tố
[root@test1 ~]# cat > fileprefix.txt
foo
bar
baz
[root@test1 ~]# sed -i'bkp.*' 's/foo/hello/' fileprefix.txt
[root@test1 ~]# cat fileprefix.txt
hello
bar
baz
[root@test1 ~]# cat bkp.fileprefix.txt
foo
bar
baz
Ví dụ 7: Đặt bản sao lưu trong thư mục
[root@test1 ~]# mkdir bkp_dir
[root@test1 ~]# sed -i'bkp_dir/*' 's/bar/hi/' fileprefix.txt
[root@test1 ~]# cat fileprefix.txt
hello
hi
baz
[root@test1 ~]# cat bkp_dir/fileprefix.txt
hello
bar
baz
# phần mở rộng có thể được thêm vào cùng
# bkp_dir / *.bkp cho hậu tố
# bkp_dir / bkp.* cho tiền tố
2.3. Xóa lệnh trong sed
Theo mặc định, lệnh sed
in mọi dòng, bao gồm mọi thay đổi.
Sử dụng tùy chọn d
lệnh, những dòng cụ thể sẽ không được in:
[root@test1 ~]# cat filea.txt
Roses are red,
Violets are blue,
Sugar is sweet,
And so are you.
[root@test1 ~]# sed '/are/d' filea.txt
Sugar is sweet,
[root@test1 ~]# seq 5 | sed '/3/d'
1
2
4
5
Tùy chọn I
cho phép lọc các dòng theo cách không phân biệt chữ hoa chữ thường
Ví dụ:
[root@test1 ~]# cat filea.txt
Roses are red,
Violets are blue,
Sugar is sweet,
And so are you.
[root@test1 ~]# sed '/rose/Id' filea.txt
Violets are blue,
Sugar is sweet,
And so are you.
2.4. Ngừng xử lý và thoát (quit) trong sed
Thoát lệnh sed
và không xử lý thêm
[root@test1 ~]# seq 23 45 | sed '5q'
23
24
25
26
27
Thoát với tùy chọn q
và Q
. Qua ví dụ dưới đây chúng ta sẽ phân biệt được sự khác nhau giữa q và Q
# q sẽ in ra số dòng bằng chỉ số trước q
[root@test1 ~]# seq 1 15 | sed '5q'
1
2
3
4
5
# Q sẽ in ra số dòng bằng chỉ số trước Q trừ 1
[root@test1 ~]# seq 1 15 | sed '5Q'
1
2
3
4
Sử dụng tac
để in tất cả các dòng bắt đầu từ lần xuất hiện cuối cùng của chuỗi tìm kiếm
[root@test1 ~]# seq 50 | tac | sed '/6/q' | tac
46
47
48
49
50
[root@test1 ~]# seq 50 | tac | sed '/6/Q' | tac
47
48
49
50