Lệnh sed toàn tập Image Lệnh sed toàn tập

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.

Minh họa cho lệnh sed

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ệnhChức năng
sed -e command filenameChỉ đị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 filenameChỉ đị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ệnhChức năng
sed s/pattern/replace_string/ fileThay thế chuỗi đầu tiên xuất hiện trong mỗi dòng
sed s/pattern/replace_string/g fileThay thế tất cả các lần xuất hiện trong mỗi dòng
sed 1,3s/pattern/replace_string/g fileThay 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 fileLư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, headtail. 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 qQ. 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