Trình chỉnh sửa luồng - Vòng lặp
Giống như các ngôn ngữ lập trình khác, SED cũng cung cấp một cơ sở lặp lại và phân nhánh để kiểm soát luồng thực thi. Trong chương này, chúng ta sẽ khám phá thêm về cách sử dụng vòng lặp và các nhánh trong SED.
Một vòng lặp trong SED hoạt động tương tự như một gototuyên bố. SED có thể nhảy đến dòng được đánh dấu bởi nhãn và tiếp tục thực hiện các lệnh còn lại. Trong SED, chúng ta có thể xác định mộtlabel như sau:
:label
:start
:end
:up
Trong ví dụ trên, tên sau dấu hai chấm (:) ngụ ý tên nhãn.
Để chuyển đến một nhãn cụ thể, chúng ta có thể sử dụng btheo sau là tên nhãn. Nếu tên nhãn bị bỏ qua, thì SED sẽ chuyển đến phần cuối của tệp SED.
Hãy để chúng tôi viết một kịch bản SED đơn giản để hiểu các vòng lặp và các nhánh. Trong tệp books.txt của chúng tôi, có một số mục nhập tên sách và tác giả của chúng. Ví dụ sau kết hợp tên sách và tên tác giả của nó trong một dòng được phân tách bằng dấu phẩy. Sau đó, nó tìm kiếm mẫu "Paulo". Nếu mẫu trùng khớp, nó sẽ in dấu gạch ngang (-) ở phía trước dòng, nếu không nó sẽ chuyển đếnPrint nhãn in dòng.
[jerry]$ sed -n '
h;n;H;x
s/\n/, /
/Paulo/!b Print
s/^/- /
:Print
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
Thoạt nhìn, đoạn script trên có thể khó hiểu. Hãy để chúng tôi làm sáng tỏ điều này.
Hai lệnh đầu tiên tự giải thích h;n;H;x và s/\n/, / kết hợp tên sách và tác giả của nó được phân tách bằng dấu phẩy (,).
Lệnh thứ ba chuyển đến nhãn Print chỉ khi mẫu không khớp, nếu không thì việc thay thế được thực hiện bởi lệnh thứ tư.
:Print chỉ là một tên nhãn và như bạn đã biết, p là lệnh in.
Để cải thiện khả năng đọc, mỗi lệnh SED được đặt trên một dòng riêng biệt. Tuy nhiên, người ta có thể chọn đặt tất cả các lệnh trong một dòng như sau:
[jerry]$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;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