Câu trả lời này là một công việc đang tiến triển - nó bỏ lỡ nhiều ví dụ về lệnh susbstolarship
Là sed
gì
sed
= Truyền phát trực tuyến
Mô tả trong trang hướng dẫn cho sed
các báo cáo GNU 4.2.2:
Sed là một biên tập viên dòng. Trình chỉnh sửa luồng được sử dụng để thực hiện chuyển đổi văn bản cơ bản trên luồng đầu vào (tệp hoặc đầu vào từ đường ống). Mặc dù trong một số cách tương tự như trình soạn thảo cho phép chỉnh sửa theo kịch bản (chẳng hạn như ed), sed hoạt động bằng cách chỉ thực hiện một lần vượt qua (các) đầu vào, và do đó hiệu quả hơn. Nhưng đó là khả năng của sed để lọc văn bản trong một đường ống, đặc biệt phân biệt nó với các loại trình soạn thảo khác.
Phần thập phân trong trang GNU sed
tại gnu.org báo cáo:
sed (trình chỉnh sửa luồng) không phải là trình soạn thảo văn bản tương tác. Thay vào đó, nó được sử dụng để lọc văn bản, tức là, nó nhập văn bản, thực hiện một số thao tác (hoặc tập hợp các thao tác) trên đó và xuất văn bản đã sửa đổi. sed thường được sử dụng để trích xuất một phần của tệp bằng cách sử dụng khớp mẫu hoặc thay thế nhiều lần xuất hiện của một chuỗi trong một tệp.
Những gì được sed
sử dụng cho?
Nó có thể được sử dụng để thực hiện các sửa đổi phức tạp đối với các luồng dữ liệu (thường là văn bản, nhưng nó cũng có thể được sử dụng để sửa đổi dữ liệu nhị phân).
Trong số các trường hợp sử dụng phổ biến nhất có:
- Chọn lọc in / xóa các dòng từ tệp văn bản bằng các biểu thức thông thường cơ bản / mở rộng
- Toàn cầu thay thế các chuỗi trong một tệp văn bản bằng cách sử dụng các biểu thức thông thường cơ bản / mở rộng
- Chọn lọc thay thế các chuỗi trong một tệp văn bản bằng các biểu thức thông thường cơ bản / mở rộng
Đây là những trường hợp sử dụng được đề cập trong câu trả lời này.
Sử dụng
sed
đọc đầu vào từ một tệp được lưu trữ trong hệ thống tệp nếu tên tệp được chỉ định trong các đối số dòng lệnh trong khi gọi hoặc từ stdin
nếu không có tên tệp được chỉ định.
Yêu cầu tối thiểu bằng cách sử dụng tệp được lưu trữ trong hệ thống tệp:
sed '' file
Gọi tối thiểu bằng cách sử dụng stdin
:
# herestring
<<<'Hello, World!' sed ''
# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF
# file
<'file' sed ''
# pipe
echo 'Hello, World!' | sed ''
Chào thế giới!
sed
theo mặc định đọc từng dòng tệp đầu vào; nó đọc một dòng, nó xóa dòng mới của dòng và đặt dòng được xử lý vào một "không gian mẫu"; cuối cùng, nó thực thi các lệnh được liệt kê trên nội dung hiện tại của không gian mẫu và đọc một dòng mới từ tệp đầu vào.
Khi không có lệnh nào được chỉ định hoặc khi một p
hoặc một d
lệnh được chỉ định *, sed
sẽ luôn in nội dung hiện tại của không gian mẫu theo sau là một dòng mới ở mỗi lần lặp bất kể:
user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed
Để ngăn chặn điều này, người ta có thể gọi sed
cùng với công -n
tắc:
user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ %
* Phát biểu chỉ cho p
, d
và s
lệnh, mà là các lệnh được đề cập trong câu trả lời này.
Lựa chọn các dòng
sed
có thể xử lý toàn bộ tệp đầu vào hoặc chỉ xử lý các dòng được chọn của tệp đầu vào; việc lựa chọn các dòng của tệp đầu vào cần xử lý được thực hiện bằng cách chỉ định "địa chỉ"; một địa chỉ có thể là (trong số những thứ khác) hoặc là một số dòng hoặc một mẫu; phạm vi của các dòng có thể được chọn bằng cách chỉ định phạm vi địa chỉ.
Các kết hợp địa chỉ có thể là:
<N>
(trong đó <N>
là một số): các lệnh / lệnh sau sẽ chỉ được thực hiện trên số dòng <N>
;
<N>,<M>
(trong đó <N>
và <M>
là hai số, <N>
> <M>
): các lệnh / lệnh sau sẽ được thực thi trên các dòng từ số <N>
dòng đến số dòng <M>
bao gồm;
/<pattern>/
(trong đó <pattern>
là một biểu thức chính quy cơ bản hoặc mở rộng): các lệnh / lệnh sau sẽ chỉ được thực hiện trên các dòng có chứa sự xuất hiện của <pattern>
;
/<pattern1>/,/<pattern2>/
(nơi <pattern1>
và <pattern2>
là cơ bản hay mở rộng biểu thức thông thường): lệnh sau / lệnh sẽ được thực hiện trên dây chuyền khác nhau, từ dòng đầu tiên chứa một sự xuất hiện của <pattern1>
sang dòng tiếp theo chứa một sự xuất hiện của <pattern2>
, nhiều lần trong trường hợp nhiều lệnh <pattern1>
- <pattern2>
lần xuất hiện;
<N>,/pattern/
(trong đó <N>
là một số và <pattern>
là một biểu thức chính quy cơ bản hoặc mở rộng): các lệnh / lệnh sau sẽ được thực thi trên các dòng từ số dòng <N>
đến dòng đầu tiên có chứa sự xuất hiện của <pattern>
;
/pattern/,<N>
(trong đó <pattern>
là một biểu thức chính quy cơ bản hoặc mở rộng và <N>
là một số): các lệnh / lệnh sau sẽ được thực thi trên các dòng từ dòng đầu tiên có chứa sự xuất hiện của <pattern>
số dòng <N>
;
Việc lựa chọn được thực hiện để in, xóa hoặc thực hiện thay thế trên phạm vi các dòng sẽ luôn bao gồm các dòng khớp với các địa chỉ đã chỉ định; hơn nữa, lựa chọn được thực hiện để in, xóa hoặc thực hiện thay thế trên các phạm vi dòng sử dụng mẫu là lười biếng và toàn cầu (nghĩa là, mỗi phạm vi bị ảnh hưởng sẽ luôn nhỏ nhất có thể và nhiều phạm vi sẽ bị ảnh hưởng).
Khi in phạm vi dòng hoặc chỉ in các dòng thay thế đã được thực hiện, cần phải gọi sed
cùng với công -n
tắc để ngăn dòng phù hợp với tiêu chí được in hai lần (điều này chỉ xảy ra khi in phạm vi dòng) và theo thứ tự để ngăn chặn các dòng không phù hợp với tiêu chí được in bất kể.
Một lựa chọn các dòng cần xử lý phải được theo sau bởi một lệnh hoặc bằng nhiều lệnh được phân tách bằng dấu chấm phẩy được nhóm lại bằng cách sử dụng dấu ngoặc nhọn.
Các lệnh: in, xóa
Các lệnh được sử dụng để in hoặc xóa một lựa chọn tương ứng là:
p
: in các dòng khớp với địa chỉ / phạm vi địa chỉ đã chỉ định;
d
: xóa các dòng khớp với địa chỉ / phạm vi địa chỉ đã chỉ định;
Khi một trong các lệnh này không được đi trước bởi một địa chỉ / lựa chọn, lệnh sẽ được thực thi trên toàn cầu, tức là trên mỗi dòng của tệp đầu vào.
Ví dụ: in, xóa
In / xóa các dòng chỉ định địa chỉ số:
Tệp mẫu:
line1
line2
line3
line4
line5
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
- In dòng
<N>
để <M>
bao gồm:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
- Xóa dòng
<N>
để <M>
bao gồm:
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5
In / xóa các dòng chỉ định mẫu:
Tệp mẫu:
First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
- Dòng in phù hợp
<pattern>
:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
- Xóa các dòng khớp
<pattern>
:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file
First line
Random line
Random line
Random line
Last line
- Bao gồm các dòng in từ dòng khớp với
<pattern1>
dòng phù hợp <pattern2>
bao gồm:
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
- Xóa các dòng từ khớp
<pattern1>
dòng với <pattern2>
bao gồm khớp dòng :
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file
First line
Last line
Lệnh: thay thế
Lệnh được sử dụng để thực hiện thay thế trên một lựa chọn là:
s
: thay thế các dòng khớp với địa chỉ / phạm vi địa chỉ đã chỉ định;
Khi lệnh này không được đi trước bởi một địa chỉ / lựa chọn, lệnh được thực thi trên toàn cầu, tức là trên mỗi dòng của tệp đầu vào.
Cú pháp của s
lệnh là:
s/<pattern>/<replacement_string>/<pattern_flags>
Dấu gạch chéo là "dấu phân cách"; chúng được sử dụng để phân định các <pattern>
, <replacement_string>
và <pattern_flags>
phần;
Dấu phân cách luôn là ký tự ngay sau s
lệnh; nó có thể được đặt thành bất kỳ ký tự nào khác, ví dụ |
:
s|<pattern>|<replacement_string>|<pattern_flags>
<pattern>
là một biểu thức chính quy cơ bản hoặc mở rộng; <replacement_string>
là một chuỗi cố định có thể bao gồm sed
các chuỗi cụ thể với ý nghĩa đặc biệt; <pattern_flags>
là một danh sách các cờ sửa đổi hành vi của <pattern>
.
Các sed
trình tự cụ thể phổ biến nhất với một ý nghĩa đặc biệt:
&
: backreference thay thế bằng chuỗi khớp với <pattern>
;
\<N>
(trong đó <N>
là một số): phản hồi thay thế bằng <N>
nhóm bị bắt trong <pattern>
;
Cờ phổ biến nhất:
g
: các lực lượng <pattern>
để khớp trên toàn cầu, tức là nhiều lần trong mỗi dòng;
i
: các lực lượng <pattern>
để khớp với trường hợp không nhạy cảm;
p
: in các dòng mà việc thay thế đã được thực hiện một lần nữa (hữu ích khi sử dụng công -n
tắc trong lệnh sed
gọi để chỉ in các dòng thay thế đã được thực hiện);
Ví dụ: thay thế
Tệp mẫu:
A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, the bird is the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the word!
A-well-a bird, bird, b-bird's the word
A-well-a...
- Thay thế sự xuất hiện đầu tiên của
<pattern>
với <replacement_string>
trên mỗi dòng:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, the bird is the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, bird, b-bird's the word
- Thay thế tất cả các lần xuất hiện của
<pattern>
với <replacement_string>
trên mỗi dòng:
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, birds, b-birds's the word
A-well-a...
- Chỉ chọn các dòng bắt đầu bằng
<pattern1>
và thay thế tất cả các lần xuất hiện <pattern2>
bằng <replacement_string>
:
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the word
- Chỉ chọn các dòng kết thúc bằng
<pattern1>
và thay thế tất cả các lần xuất hiện <pattern2>
bằng <replacement_string>
:
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, b-birds's the word
Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.