Sed là gì và dùng để làm gì?


20

sedGần đây tôi đã nhìn thấy rất nhiều , và tôi thấy đó là một mệnh lệnh khá khó hiểu. Các trang này không đặc biệt hữu ích, nhưng tôi biết rằng nó có thể được sử dụng để phân tích cú pháp đầu ra của các lệnh khác.

Chính xác thì nó là sedgì và nó đang sử dụng cái gì? Tôi đang tìm kiếm một câu trả lời toàn diện bao gồm những gì sed, nó thường được sử dụng cho và một số ví dụ / cú pháp cơ bản.


3
Từ trang Sed man: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.
saji89

Đây phải là một nơi tốt để bắt đầu một câu trả lời toàn diện: en.wikipedia.org/wiki/Sed
saji89

1
info sedcó nhiều hơn man sed. Sau đó, trong /usr/share/doc/sed, có sedfaq.txt.gz.

Câu trả lời:


20

Trong sử dụng cơ bản, nó được sử dụng để 'tìm kiếm và thay thế' bằng các chuỗi.

echo "The quick brown fox jumps over the lazy dog" | sed 's/dog/cat/'

trả lại

"The quick brown fox jumps over the lazy cat"

Sed thực sự tỏa sáng khi các biểu thức thông thường được sử dụng với nó.

Bạn có thể muốn xem bài viết này về sed, nó khá toàn diện.


5

Định nghĩa

Unix System V: một hướng dẫn thực tế , cuốn sách của Mark Sobell:

Tiện ích sed là một trình soạn thảo hàng loạt (không tương tác). Các lệnh sed thường được lưu trữ trong một tập lệnh. . . mặc dù bạn có thể đưa ra các lệnh sed đơn giản từ dòng lệnh. . .

Trang con người cho sed (GNU sed) 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 để tạo các biế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).

Định nghĩa không chính thức của tôi:

Sed(viết tắt của trình soạn thảo luồng ) là một tiện ích xử lý văn bản được phát triển tại thời điểm văn bản được xử lý một dòng tại một thời điểm, nhưng vẫn là một trong những tiện ích Unix / Linux mạnh nhất; đồng thời, nó là một dạng ngôn ngữ kịch bản, được thiết kế đặc biệt để xử lý văn bản.

Công dụng

Như các định nghĩa cho thấy, sedđược sử dụng cho các dòng xử lý hàng loạt văn bản, tệp văn bản và các luồng văn bản được dẫn. Thông thường, nó được sử dụng để thay thế cũng như xóa văn bản:

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

Tuy nhiên, nó cũng có thể được sử dụng để bắt chước hành vi của các lệnh khác. Ví dụ:

  • để bắt chước dmesg | head -n 3(in 3 dòng đầu tiên), chúng ta có thể làm dmesg | sed -n 1,3p.
  • để bắt chước dmesg | grep 'wlan0'(tìm kiếm một chuỗi), chúng ta có thể làmdmesg | sed -n '/wlan0/p'
  • Danh sách mục

Ưu điểm lớn sedcó các tiện ích xử lý văn bản khác là -icờ, có nghĩa là chúng ta không thể chỉ xuất văn bản đã chỉnh sửa ra màn hình mà thực sự lưu chỉnh sửa vào tệp gốc. awkhương vị, ngược lại, chỉ có tính năng như vậy trong GNU awkphiên bản.

sedcó thể lấy đầu vào trên dòng lệnh, với nhiều mẫu được phân tách bằng dấu chấm phẩy ( ;) hoặc từ tệp tập lệnh được chỉ định sau -fcờ, ví dụ:cat someTextfile.txt | sed -f myScript.sed

Các ứng dụng và ví dụ về Sed



1

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


sed

sed = Truyền phát trực tuyến

Mô tả trong trang hướng dẫn cho sedcá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 sedtạ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 sedsử 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ừ stdinnế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!

sedtheo 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 phoặc một dlệnh được chỉ định *, sedsẽ 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 sedcùng với công -ntắ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, dslệ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

sedcó 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><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><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ếngtoà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 sedcùng với công -ntắ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
  • Dây chuyền in <N>:
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • Xóa dòng <N>:
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 slệ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><pattern_flags>phần;

Dấu phân cách luôn là ký tự ngay sau slệ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 sedcá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 sedtrì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 -ntắc trong lệnh sedgọ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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.