Trình chỉnh sửa luồng - Lệnh cơ bản

Chương này mô tả một số lệnh SED hữu ích.

Xóa lệnh

SED cung cấp các lệnh khác nhau để thao tác với văn bản. Trước tiên hãy để chúng tôi khám phá vềdeletechỉ huy. Đây là cách bạn thực hiện lệnh xóa:

[address1[,address2]]d

address1address2lần lượt là địa chỉ bắt đầu và địa chỉ kết thúc, có thể là số dòng hoặc chuỗi mẫu. Cả hai địa chỉ này đều là tham số tùy chọn.

Như tên cho thấy, lệnh xóa được sử dụng để thực hiện thao tác xóa và vì SED hoạt động trực tuyến, chúng ta có thể nói rằng lệnh này được sử dụng để xóa các dòng. Lưu ý rằng lệnh xóa chỉ xóa các dòng khỏi bộ đệm mẫu; dòng không được gửi đến dòng đầu ra và tệp gốc vẫn không thay đổi. Ví dụ sau minh họa quan điểm.

[jerry]$ sed 'd' books.txt

Nhưng đâu là đầu ra? Nếu không có địa chỉ dòng nào được cung cấp, thì SED hoạt động trên mọi dòng theo mặc định. Do đó, nó xóa tất cả các dòng khỏi bộ đệm mẫu. Đó là lý do tại sao lệnh không in bất cứ thứ gì trên đầu ra tiêu chuẩn.

Hãy để chúng tôi hướng dẫn SED chỉ hoạt động trên một số tuyến nhất định. Ví dụ sau chỉ loại bỏ dòng thứ 4.

[jerry]$ sed '4d' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Ngoài ra, SED cũng chấp nhận dải địa chỉ sử dụng dấu phẩy (,). Chúng tôi có thể hướng dẫn SED loại bỏ các dòng N1 đến N2. Ví dụ, ví dụ sau đây xóa tất cả các dòng từ 2 đến 4.

[jerry]$ sed '2, 4 d' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Phạm vi địa chỉ của SED không chỉ giới hạn ở số lượng. Chúng tôi cũng có thể chỉ định các mẫu làm địa chỉ. Ví dụ sau đây loại bỏ tất cả các sách của tác giả Paulo Coelho.

[jerry]$ sed '/Paulo Coelho/d' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864

Chúng tôi cũng có thể chỉ định một dải địa chỉ bằng cách sử dụng mẫu văn bản. Ví dụ sau loại bỏ tất cả các dòng giữa các mẫuStormFellowship.

[jerry]$ sed '/Storm/,/Fellowship/d' books.txt  
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Ngoài ra, chúng ta cũng có thể sử dụng các toán tử đô la ($), cộng (+) và dấu ngã (~) với SED.

Viết lệnh

Một trong những thao tác quan trọng mà chúng tôi thực hiện trên bất kỳ tệp nào là sao lưu, tức là chúng tôi tạo một bản sao khác của tệp. SED cung cấpwritelệnh để lưu trữ nội dung của bộ đệm mẫu trong một tệp. Dưới đây là cú pháp củawrite lệnh tương tự như lệnh delete chỉ huy.

[address1[,address2]]w file

Đây, address1address2lần lượt là địa chỉ bắt đầu và địa chỉ kết thúc, có thể là số dòng hoặc chuỗi mẫu. Cả hai địa chỉ này đều là tham số tùy chọn.

Trong cú pháp trên, w đề cập đến lệnh ghi và filelà tên tệp mà bạn lưu trữ nội dung. Hãy cẩn thận vớifiletham số. Khi tên tệp được cung cấp, SED sẽ tạo một tệp ngay lập tức nếu nó chưa có và ghi đè lên nếu nó đã có.

Hãy để chúng tôi tạo bản sao chính xác của tệp bằng SED. Lưu ý rằng phải có chính xác một khoảng trắng giữawfile.

[jerry]$ sed -n 'w books.bak' books.txt

Chúng tôi đã tạo một tệp khác có tên là books.bak. Bây giờ hãy xác minh rằng cả hai tệp đều có nội dung giống hệt nhau.

[jerry]$ diff books.txt books.bak  
[jerry]$ echo $?

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

0

Bạn có thể cho rằng cplệnh thực hiện chính xác những điều tương tự. Đúng! Cáccplệnh cũng làm điều tương tự, nhưng SED là một tiện ích hoàn thiện. Nó cho phép tạo một tệp chỉ chứa một số dòng nhất định từ tệp nguồn. Hãy để chúng tôi chỉ lưu trữ các dòng chẵn vào một tệp khác.

[jerry]$ sed -n '2~2 w junk.txt' books.txt [jerry]$ cat junk.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864

Bạn cũng có thể sử dụng các toán tử dấu phẩy (,), đô la ($) và dấu cộng (+) với lệnh ghi.

Ngoài ra, SED cũng hỗ trợ khớp mẫu với lệnh ghi. Giả sử bạn muốn lưu trữ tất cả sách của các tác giả riêng lẻ vào một tệp riêng biệt. Một cách nhàm chán và dài dòng là làm thủ công, và cách thông minh hơn là sử dụng SED.

[jerry]$ sed -n -e '/Martin/ w Martin.txt' -e '/Paulo/ w Paulo.txt' -e '/Tolkien/ w 
Tolkien.txt' books.txt

Trong ví dụ trên, chúng tôi đang đối sánh từng dòng với một mẫu và lưu trữ dòng phù hợp trong một tệp cụ thể. Nó rất đơn giản. Để chỉ định nhiều lệnh, chúng tôi đã sử dụng-echuyển đổi của lệnh SED. Bây giờ hãy sử dụng xem mỗi tệp chứa những gì:

[jerry]$ cat Martin.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
6) A Game of Thrones, George R. R. Martin, 864

Hãy để chúng tôi hiển thị nội dung tệp.

[jerry]$ cat Paulo.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288

Hãy để chúng tôi hiển thị nội dung tệp.

[jerry]$ cat Tolkien.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432

Thông minh! Chúng tôi đã nhận được kết quả mong đợi. SED thực sự là một tiện ích tuyệt vời.

Nối lệnh

Một trong những hoạt động hữu ích nhất của bất kỳ trình soạn thảo văn bản nào là cung cấp chức năng nối thêm. SED hỗ trợ thao tác này thông qua lệnh append của nó. Dưới đây là cú pháp của append:

[address]a\ 
Append text

Hãy để chúng tôi thêm một mục nhập sách mới sau dòng số 4. Ví dụ sau đây cho thấy cách thực hiện

[jerry]$ sed '4 a 7) Adultry, Paulo Coelho, 234' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
7) Adultry, Paulo Coelho, 234 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Trong phần lệnh, 4 ngụ ý số dòng, a là lệnh nối thêm, và phần còn lại là văn bản cần nối.

Hãy để chúng tôi chèn một dòng văn bản vào cuối tệp. Để làm điều này, hãy sử dụng$như địa chỉ. Ví dụ sau đây minh họa điều này:

[jerry]$ sed '$ a 7) Adultry, Paulo Coelho, 234' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864 
7) Adultry, Paulo Coelho, 234

Ngoài số dòng, chúng ta cũng có thể chỉ định một địa chỉ bằng cách sử dụng mẫu văn bản. Ví dụ: ví dụ sau thêm văn bản sau khi khớp với chuỗiThe Alchemist.

[jerry]$ sed '/The Alchemist/ a 7) Adultry, Paulo Coelho, 234' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 234 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Lưu ý rằng nếu có nhiều mẫu khớp với nhau thì văn bản sẽ được nối sau mỗi lần khớp. Ví dụ sau minh họa tình huống này.

[jerry]$ sed '/The/ a 7) Adultry, Paulo Coelho, 234' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
7) Adultry, Paulo Coelho, 234 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 234 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
7) Adultry, Paulo Coelho, 234 
5) The Pilgrimage, Paulo Coelho, 288 
7) Adultry, Paulo Coelho, 234 
6) A Game of Thrones, George R. R. Martin, 864

Thay đổi lệnh

SED cung cấp change hoặc là replacelệnh được đại diện bởi c. Lệnh này giúp thay thế một dòng hiện có bằng văn bản mới. Khi phạm vi dòng được cung cấp, tất cả các dòng được thay thế thành một nhóm bằng một dòng văn bản. Dưới đây là cú pháp của lệnh thay đổi:

[address1[,address2]]c\ 
Replace text

Hãy để chúng tôi thay thế dòng thứ ba bằng một số văn bản khác.

[jerry]$ sed '3 c 3) Adultry, Paulo Coelho, 324' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

SED cũng chấp nhận các mẫu làm địa chỉ. Trong ví dụ sau, một dòng được thay thế khi khớp mẫu thành công.

[jerry]$ sed '/The Alchemist/ c 3) Adultry, Paulo Coelho, 324' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

SED cũng cho phép thay thế nhiều dòng bằng một dòng duy nhất. Ví dụ sau đây loại bỏ các dòng từ thứ tư đến thứ sáu và thay thế chúng bằng văn bản mới.

[jerry]$ sed '4, 6 c 4) Adultry, Paulo Coelho, 324' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) Adultry, Paulo Coelho, 324

Chèn lệnh

Lệnh insert hoạt động giống như append. Sự khác biệt duy nhất là nó chèn một dòng trước một vị trí cụ thể. Dưới đây là cú pháp của lệnh chèn:

[address]i\ 
Insert text

Hãy để chúng tôi hiểu lệnh chèn với một số ví dụ. Lệnh sau sẽ chèn một mục mới trước dòng thứ tư.

[jerry]$ sed '4 i 7) Adultry, Paulo Coelho, 324' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Trong ví dụ trên, 4 là số vị trí, i ngụ ý lệnh chèn, và phần còn lại là văn bản sẽ được chèn.

Để chèn văn bản vào đầu tệp, hãy cung cấp địa chỉ dòng dưới dạng 1. Lệnh sau minh họa điều này:

[jerry]$ sed '1 i 7) Adultry, Paulo Coelho, 324' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

7) Adultry, Paulo Coelho, 324
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Ngoài ra, chúng ta có thể chèn nhiều dòng. Lệnh sau sẽ chèn hai dòng trước dòng cuối cùng.

[jerry]$ sed '$ i 7) Adultry, Paulo Coelho, 324

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

8) Eleven Minutes, Paulo Coelho, 304' books.txt 
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage,Paulo Coelho, 288 
7) Adultry, Paulo Coelho, 324 
8) Eleven Minutes, Paulo Coelho, 304 
6) A Game of Thrones, George R. R. Martin, 864

Lưu ý rằng các mục cần chèn được nhập trên các dòng riêng biệt và được phân cách bằng ký tự dấu gạch chéo ngược (\).

Dịch lệnh

SED cung cấp một lệnh để dịch các ký tự và nó được biểu diễn dưới dạng y. Nó biến đổi các ký tự theo vị trí. Dưới đây là cú pháp của lệnh dịch:

[address1[,address2]]y/list-1/list-2/

Lưu ý rằng bản dịch dựa trên vị trí của ký tự từ list 1 cho nhân vật ở cùng vị trí trong list 2và cả hai danh sách phải là danh sách ký tự rõ ràng. Biểu thức chính quy và các lớp ký tự không được hỗ trợ. Ngoài ra, kích thước củalist 1list 2 phải giống nhau.

Ví dụ sau đây chuyển đổi số Ả Rập sang số La Mã.

[jerry]$ echo "1 5 15 20" | sed 'y/151520/IVXVXX/'

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

I V IV XX

l lệnh

Bạn có thể phân biệt giữa các từ được phân tách bằng dấu cách và các từ được phân tách bằng ký tự tab chỉ bằng cách nhìn chúng không? Chắc chắn không. Nhưng SED có thể làm điều này cho bạn. SED sử dụngllệnh hiển thị các ký tự ẩn trong văn bản. Ví dụ: ký tự tab với\t và End-Of-Line với $tính cách. Dưới đây là cú pháp củal chỉ huy.

[address1[,address2]]l 
[address1[,address2]]l [len]

Hãy để chúng tôi tạo một tệp với các ký tự tab để trình diễn. Để đơn giản, chúng ta sẽ sử dụng cùng một tệp, chỉ bằng cách thay thế khoảng trắng bằng các tab. Chờ đợi! Nhưng làm thế nào để làm điều đó - bằng cách mở tệp trong trình soạn thảo văn bản và thay thế từng khoảng trắng bằng tab? Chắc chắn không! Chúng ta có thể sử dụng các lệnh SED cho việc đó.

[jerry]$ sed 's/ /\t/g' books.txt > junk.txt

Bây giờ, chúng ta hãy hiển thị các ký tự ẩn bằng cách sử dụng l chỉ huy:

[jerry]$ sed -n 'l' junk.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1)\tA\tStorm\tof\tSwords,George\tR.\tR.\tMartin,1216$ 2)\tThe\tTwo\tTowers,J.\tR.\tR.\tTolkien,352$ 
3)\tThe\tAlchemist,Paulo\tCoelho,197$ 4)\tThe\tFellowship\tof\tthe\tRing,J.\tR.\tR.\tTolkien,432$ 
5)\tThe\tPilgrimage,Paulo\tCoelho,288$ 6)\tA\tGame\tof\tThrones,George\tR.\tR.\tMartin\t,864$

Giống như các lệnh SED khác, nó cũng chấp nhận số dòng và mẫu làm địa chỉ. Bạn có thể tự mình thử.

Hãy cùng chúng tôi xem xét kỹ một tính năng thú vị khác của SED. Chúng tôi có thể hướng dẫn SED thực hiện gói dòng sau một số ký tự nhất định. Ví dụ sau bao gồm các dòng sau 25 ký tự.

[jerry]$ sed -n 'l 25' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords,Geo\ 
rge R. R. Martin,1216$ 
2) The Two Towers,J. R. \ 
R. Tolkien,352$ 3) The Alchemist,Paulo C\ oelho,197$ 
4) The Fellowship of the\ 
 Ring,J. R. R. Tolkien,4\ 
32$ 5) The Pilgrimage,Paulo \ Coelho,288$ 
6) A Game of Thrones,Geo\ 
rge R. R. Martin ,864$

Lưu ý rằng trong ví dụ trên, giới hạn quấn được cung cấp sau lệnh l. Trong trường hợp này, nó là 25 ký tự. Tùy chọn này dành riêng cho GNU và có thể không hoạt động với các biến thể khác của SED.

Giới hạn bao bọc là 0 có nghĩa là không bao giờ ngắt dòng trừ khi có một ký tự dòng mới. Lệnh đơn giản sau minh họa điều này.

[jerry]$ sed -n 'l 0' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords,George R. R. Martin,1216$ 2) The Two Towers,J. R. R. Tolkien,352$ 
3) The Alchemist,Paulo Coelho,197$ 4) The Fellowship of the Ring,J. R. R. Tolkien,432$ 
5) The Pilgrimage,Paulo Coelho,288$ 6) A Game of Thrones,George R. R. Martin,864$

Lệnh thoát

Lệnh Quit hướng dẫn SED thoát khỏi quy trình thực thi hiện tại. Nó được đại diện bởiqchỉ huy. Dưới đây là cú pháp của lệnh thoát:

[address]q 
[address]q [value]

Lưu ý rằng lệnh thoát không chấp nhận phạm vi địa chỉ, nó chỉ hỗ trợ một địa chỉ duy nhất. Theo mặc định, SED tuân theo quy trình công việc đọc, thực thi và lặp lại; nhưng khi gặp phải lệnh thoát, nó chỉ dừng việc thực thi hiện tại.

Hãy để chúng tôi in 3 dòng đầu tiên từ tệp.

[jerry]$ sed '3 q' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

Ngoài số dòng, chúng ta cũng có thể sử dụng các mẫu văn bản. Lệnh sau sẽ thoát khi khớp mẫu thành công.

[jerry]$ sed '/The Alchemist/ q' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

Ngoài điều này, SED cũng có thể chấp nhận valuecó thể được sử dụng làm trạng thái thoát. Lệnh sau hiển thị trạng thái thoát của nó là 100.

[jerry]$ sed '/The Alchemist/ q 100' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

Bây giờ hãy để chúng tôi xác minh trạng thái thoát.

[jerry]$ echo $?

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

100

Đọc lệnh

Chúng tôi có thể hướng dẫn SED đọc nội dung của tệp và hiển thị chúng khi một điều kiện cụ thể phù hợp. Lệnh được biểu thị bằng bảng chữ cáir. Dưới đây là cú pháp của lệnh đọc.

[address]r file

Lưu ý rằng phải có chính xác một khoảng trắng giữa r lệnh và tên tệp.

Hãy để chúng tôi hiểu nó với một ví dụ đơn giản. Tạo một tệp mẫu có tênjunk.txt.

[jerry]$ echo "This is junk text." > junk.txt

Lệnh sau hướng dẫn SED đọc nội dung của junk.txt và chèn chúng sau dòng thứ ba.

[jerry]$ sed '3 r junk.txt' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Trong ví dụ trên, 3 ngụ ý địa chỉ dòng, r là tên lệnh, và junk.txtlà tên tệp mà nội dung sẽ được hiển thị. Ngoài ra, GNU SED cũng chấp nhận một loạt các địa chỉ. Ví dụ: lệnh sau sẽ chèn nội dung củajunk.txt sau dòng thứ ba, thứ tư và thứ năm.

[jerry]$ sed '3, 5 r junk.txt' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
This is junk text. 
5) The Pilgrimage, Paulo Coelho, 288 
This is junk text. 
6) A Game of Thrones, George R. R. Martin, 864

Giống như các lệnh SED khác, lệnh đọc cũng chấp nhận mẫu làm địa chỉ. Ví dụ: lệnh sau sẽ chèn nội dung củajunk.txt khi khớp mẫu thành công.

[jerry]$ sed '/Paulo/ r junk.txt' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
This is junk text. 
6) A Game of Thrones, George R. R. Martin, 864

Thực thi lệnh

Chúng tôi có thể thực hiện các lệnh bên ngoài từ SED bằng cách sử dụng executechỉ huy. Nó được đại diện bởie. Dưới đây là cú pháp của lệnh thực thi.

[address1[,address2]]e [command]

Hãy để chúng tôi minh họa lệnh thực thi bằng một ví dụ đơn giản. Lệnh SED sau đây thực thi UNIXdate lệnh trước dòng thứ ba.

[jerry]$ sed '3 e date' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
Sun Sep  7 18:04:49 IST 2014 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Giống như các lệnh khác, nó cũng chấp nhận các mẫu như một địa chỉ. Ví dụ, ví dụ sau đây thực thidatelệnh khi khớp mẫu thành công. Lưu ý rằng sau mỗi lần khớp mẫu, đầu tiên lệnh được thực thi và sau đó nội dung của bộ đệm mẫu được hiển thị.

[jerry]$ sed '/Paulo/ e date' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
Sun Sep  7 18:06:04 IST 2014 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
Sun Sep  7 18:06:04 IST 2014 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Nếu bạn quan sát cú pháp của e ra lệnh cẩn thận, bạn sẽ nhận thấy rằng commandLà tùy chọn. Khi không có lệnh nào được cung cấp saue,nó coi nội dung của bộ đệm mẫu như một lệnh bên ngoài. Để minh họa điều này, chúng ta hãy tạo một tệp lệnh.txt bằng một vài lệnh đơn giản.

[jerry]$ echo -e "date\ncal\nuname" > commands.txt 
[jerry]$ cat commands.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

date 
cal 
uname

Các lệnh từ tệp là tự giải thích. Trong trường hợp không cócommand sau e,SED thực hiện tất cả các lệnh này từng cái một. Ví dụ đơn giản sau đây minh họa điều này.

[jerry]$ sed 'e' commands.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

Sun Sep  7 18:14:20 IST 2014 
   September 2014      
Su Mo Tu We Th Fr Sa   
    1  2  3  4  5  6   
 7  8  9 10 11 12 13   
14 15 16 17 18 19 20   
21 22 23 24 25 26 27   
28 29 30               
                       
Linux

Giống như các lệnh SED khác, lệnh thực thi cũng chấp nhận tất cả các phạm vi địa chỉ hợp lệ.

Các lệnh khác

Theo mặc định, SED hoạt động trên một đường dây, tuy nhiên nó cũng có thể hoạt động trên nhiều đường dây. Lệnh nhiều dòng được ký hiệu bằng chữ hoa. Ví dụ, không giống nhưn lệnh, Nlệnh không xóa và in không gian mẫu. Thay vào đó, nó thêm một dòng mới (\ n) vào cuối không gian mẫu hiện tại và nối dòng tiếp theo từ tệp đầu vào vào không gian mẫu hiện tại và tiếp tục với quy trình chuẩn của SED bằng cách thực hiện phần còn lại của các lệnh SED. Dưới đây là cú pháp củaN chỉ huy.

[address1[,address2]]N

Hãy để chúng tôi in danh sách tên sách và tác giả tương ứng được phân tách bằng dấu phẩy. Ví dụ sau đây minh họa điều này.

[jerry]$ sed 'N; s/\n/, /g' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

Hãy để chúng tôi hiểu cách hoạt động của ví dụ trên. CácNlệnh đọc dòng đầu tiên, tức là A Storm of Swords vào vùng đệm mẫu và nối \ n theo sau là dòng tiếp theo. Không gian mẫu hiện chứa A Storm of Swords\nGeorge RR Martin. Trong bước tiếp theo, chúng tôi sẽ thay thế dòng mới bằng dấu phẩy.

Giống p lệnh, chúng tôi có một P lệnh để in phần đầu tiên (lên đến dòng mới được nhúng) của không gian mẫu nhiều dòng được tạo bởi Nchỉ huy. Dưới đây là cú pháp củaP lệnh tương tự như lệnh p chỉ huy.

[address1[,address2]]P

Trong ví dụ trước, chúng ta thấy rằng Nlệnh tạo một danh sách được phân tách bằng dòng mới gồm tên sách và tác giả của chúng. Chúng ta hãy chỉ in phần đầu của cuốn sách, tức là chỉ các tiêu đề của cuốn sách. Lệnh sau minh họa điều này.

[jerry]$ sed -n 'N;P' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

A Storm of Swords 
The Two Towers 
The Alchemist 
The Fellowship of the Ring 
The Pilgrimage 
A Game of Thrones

Lưu ý rằng trong trường hợp không có N, nó hoạt động giống như pchỉ huy. Lệnh đơn giản sau minh họa tình huống này.

[jerry]$ sed -n 'P' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage 
Paulo Coelho 
A Game of Thrones 
George R. R. Martin

Ngoài ra, SED cũng cung cấp một vlệnh kiểm tra phiên bản. Nếu phiên bản được cung cấp lớn hơn phiên bản SED đã cài đặt, thì việc thực thi lệnh không thành công. Lưu ý rằng tùy chọn này dành riêng cho GNU và có thể không hoạt động với các biến thể khác của SED. Dưới đây là cú pháp củav chỉ huy.

[address1[,address2]]v [version]

Trước tiên, hãy tìm hiểu phiên bản hiện tại của SED.

[jerry]$ sed --version

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

sed (GNU sed) 4.2.2

Trong ví dụ sau, phiên bản SED lớn hơn phiên bản 4.2.2, do đó lệnh SED hủy bỏ quá trình thực thi của nó.

[jerry]$ sed 'v 4.2.3' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

sed: -e expression #1, char 7: expected newer version of sed

Nhưng nếu phiên bản được cung cấp nhỏ hơn hoặc bằng phiên bản 4.2.2, thì lệnh sẽ hoạt động như mong đợi.

[jerry]$ sed 'v 4.2.2' books.txt

Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage 
Paulo Coelho 
A Game of Thrones George R. R. Martin