Stream Editor - Quản lý các mẫu
Chúng ta đã thảo luận về việc sử dụng mẫu và đệm giữ. Trong chương này, chúng ta sẽ khám phá thêm về cách sử dụng của chúng. Hãy để chúng tôi thảo luận vềnlệnh in không gian mẫu. Nó sẽ được sử dụng kết hợp với các lệnh khác. Dưới đây là cú pháp của lệnh then.
[address1[,address2]]n
Chúng ta hãy lấy một ví dụ.
[jerry]$ sed 'n' books.txt
Khi đoạn mã trên được thực thi, nó sẽ tạo ra 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
Các n lệnh in nội dung của bộ đệm mẫu, xóa bộ đệm mẫu, tìm nạp dòng tiếp theo vào bộ đệm mẫu và áp dụng các lệnh trên đó.
Chúng ta hãy xem xét có ba lệnh SED trước n và hai lệnh SED sau n như sau:
Sed command #1
Sed command #2
Sed command #3
n command
Sed command #4
Sed command #5
Trong trường hợp này, SED áp dụng ba lệnh đầu tiên trên bộ đệm mẫu, xóa bộ đệm mẫu, tìm nạp dòng tiếp theo vào bộ đệm mẫu và sau đó áp dụng lệnh thứ tư và thứ năm trên đó. Đây là một khái niệm rất quan trọng. Đừng tiếp tục mà không có một sự hiểu biết rõ ràng về điều này.
Bộ đệm lưu giữ dữ liệu, nhưng các lệnh SED không thể được áp dụng trực tiếp trên bộ đệm lưu giữ. Do đó, chúng ta cần đưa dữ liệu bộ đệm lưu vào bộ đệm mẫu. SED cung cấpxlệnh trao đổi nội dung của mẫu và giữ bộ đệm. Các lệnh sau minh họax chỉ huy.
Hãy để chúng tôi sửa đổi một chút tệp books.txt. Giả sử, tệp chứa tên sách theo sau là tên tác giả của chúng. Sau khi sửa đổi, tệp sẽ trông như thế này:
[jerry]$ cat 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 trao đổi nội dung của hai bộ đệm. Ví dụ, ví dụ sau chỉ in tên của các tác giả.
[jerry]$ sed -n 'x;n;p' books.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
George R. R. Martin
J. R. R. Tolkien
Paulo Coelho
J. R. R. Tolkien
Paulo Coelho
George R. R. Martin
Hãy để chúng tôi hiểu cách hoạt động của lệnh này.
Ban đầu, SED đọc dòng đầu tiên, tức là A Storm of Swords vào vùng đệm mẫu.
x lệnh di chuyển dòng này đến vùng đệm giữ.
n tìm nạp dòng tiếp theo, tức là George RR Martin vào bộ đệm mẫu.
Điều khiển chuyển đến lệnh theo sau là n, lệnh này sẽ in nội dung của bộ đệm mẫu.
Quá trình lặp lại cho đến khi tệp hết.
Bây giờ chúng ta hãy trao đổi nội dung của bộ đệm trước khi in. Đoán xem, điều gì xảy ra? Có, nó in tên sách.
[jerry]$ sed -n 'x;n;x;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
Các hlệnh xử lý với bộ đệm giữ. Nó sao chép dữ liệu từ bộ đệm mẫu sang bộ đệm giữ. Dữ liệu hiện có từ bộ đệm lưu giữ bị ghi đè. Lưu ý rằnghlệnh không di chuyển dữ liệu, nó chỉ sao chép dữ liệu. Do đó, dữ liệu được sao chép vẫn nguyên như trong bộ đệm mẫu. Dưới đây là cú pháp củah chỉ huy.
[address1[,address2]]h
Lệnh sau chỉ in các tiêu đề của tác giả Paulo Coelho.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
The Alchemist
The Pilgrimage
Hãy để chúng tôi hiểu cách hoạt động của lệnh trên. Nội dung của books.txt tuân theo một định dạng cụ thể. Dòng đầu tiên là tên sách tiếp theo là tác giả của cuốn sách. Trong lệnh trên, "!" được sử dụng để đảo ngược điều kiện, tức là, dòng chỉ được sao chép vào bộ đệm lưu giữ khi khớp mẫu không thành công. Và dấu ngoặc nhọn {} được sử dụng để nhóm nhiều lệnh SED
Trong lần chuyển lệnh đầu tiên, SED đọc dòng đầu tiên, tức là A Storm of Swords vào bộ đệm mẫu và kiểm tra xem nó có chứa mẫu Paulo hay không. Khi khớp mẫu không thành công, nó sẽ sao chép dòng này vào vùng đệm lưu giữ. Bây giờ cả bộ đệm mẫu và bộ đệm giữ đều chứa cùng một dòng, tức là A Storm of Swords. Trong bước thứ hai, nó kiểm tra xem dòng có chứa mẫu Paulo hay không. Như mô hình không phù hợp, nó không làm bất cứ điều gì.
Trong lần vượt qua thứ hai, nó đọc dòng tiếp theo George RR Martin vào bộ đệm mẫu và áp dụng các bước tương tự. Đối với ba dòng tiếp theo, nó cũng làm điều tương tự. Vào cuối lần vượt qua thứ năm, cả hai bộ đệm đều chứa The Alchemist. Khi bắt đầu đường chuyền thứ sáu, nó đọc dòng Paulo Coelho và khi mẫu trùng khớp, nó không sao chép dòng này vào vùng đệm giữ. Do đó, bộ đệm mẫu chứa Paulo Coelho và bộ đệm giữ chứa Nhà giả kim.
Sau đó, nó sẽ kiểm tra xem bộ đệm mẫu có chứa mẫu Paulo hay không. Khi khớp mẫu thành công, nó sẽ trao đổi nội dung của bộ đệm mẫu với bộ đệm giữ. Bây giờ bộ đệm mẫu chứa Nhà giả kim và bộ đệm giữ chứa Paulo Coelho. Cuối cùng, nó in nội dung của bộ đệm mẫu. Các bước tương tự cũng được áp dụng cho mẫu The Pilgrimage.
Các hlệnh hủy nội dung trước đó của bộ đệm giữ. Điều này không phải lúc nào cũng được chấp nhận, vì đôi khi chúng ta cần bảo quản đồ đạc bên trong. Vì mục đích này, SED cung cấpHlệnh gắn nội dung vào bộ đệm lưu bằng cách thêm một dòng mới vào cuối. Sự khác biệt duy nhất giữah và Hlà lệnh trước đây ghi đè dữ liệu từ bộ đệm lưu giữ, trong khi lệnh sau này gắn dữ liệu vào bộ đệm lưu giữ. Cú pháp của nó tương tự nhưh chỉ huy.
[address1[,address2]]H
Hãy để chúng tôi lấy một ví dụ khác. Lần này, thay vì chỉ in tên sách, hãy in tên tác giả của chúng. Ví dụ sau in tên sách theo sau là tên tác giả của chúng.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
The Alchemist
Paulo Coelho
The Pilgrimage
Paulo Coelho
Chúng tôi đã học cách sao chép / nối nội dung của bộ đệm mẫu để giữ bộ đệm. Chúng ta có thể thực hiện chức năng đảo ngược không? Vâng chắc chắn! Vì mục đích này, SED cung cấpglệnh sao chép dữ liệu từ bộ đệm giữ vào bộ đệm mẫu. Trong khi sao chép, dữ liệu hiện có từ không gian mẫu sẽ bị ghi đè. Dưới đây là cú pháp củag chỉ huy.
[address1[,address2]]g
Chúng ta hãy xem xét cùng một ví dụ - in tên sách và tác giả của chúng. Lần này, đầu tiên chúng tôi sẽ in tên tác giả và trên dòng tiếp theo là tên sách tương ứng. Lệnh sau in tên tác giả Paulo Coelho, theo sau là tên sách.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Paulo Coelho
The Alchemist
Paulo Coelho
The Pilgrimage
Lệnh đầu tiên được giữ nguyên. Vào cuối lần vượt qua thứ năm, cả hai bộ đệm đều chứa The Alchemist. Khi bắt đầu đường chuyền thứ sáu, nó đọc dòng Paulo Coelho và khi mẫu trùng khớp, nó không sao chép dòng này vào vùng đệm giữ. Do đó, không gian mẫu chứa Paulo Coelho và không gian giữ chứa Nhà giả kim.
Sau đó, nó kiểm tra xem không gian mẫu có chứa mẫu Paulo hay không. Khi khớp mẫu thành công, trước tiên nó in nội dung của không gian mẫu, tức là Paulo Coelho, sau đó nó sao chép bộ đệm lưu vào bộ đệm mẫu. Do đó, cả bộ đệm mẫu và bộ đệm giữ đều chứa The Alchemist. Cuối cùng, nó in nội dung của bộ đệm mẫu. Các bước tương tự cũng được áp dụng cho mẫu The Pilgrimage.
Tương tự, chúng ta có thể nối nội dung của bộ đệm giữ vào bộ đệm mẫu. SED cung cấpG lệnh gắn nội dung vào bộ đệm mẫu bằng cách thêm một dòng mới vào cuối.
[address1[,address2]]G
Bây giờ chúng ta hãy lấy ví dụ trước in tên tác giả Paulo Coelhofo, theo tên cuốn sách. Để đạt được kết quả tương tự, hãy thực hiện lệnh SED sau.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
Paulo Coelho
The Alchemist
Paulo Coelho
The Pilgrimage
Bạn có thể sửa đổi ví dụ trên để hiển thị tên sách theo sau là tác giả của chúng không? Đơn giản, chỉ cần trao đổi nội dung bộ đệm trướcG chỉ huy.
[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt
Khi thực thi đoạn mã trên, bạn nhận được kết quả sau:
The Alchemist
Paulo Coelho
The Pilgrimage
Paulo Coelho