Ba sedlệnh khác nhau :
sed '$!N;s/"[^"]*"\n<[^>]*>/other characters /;P;D'
sed -e :n -e '$!N;s/"[^"]*"\n<[^>]*>/other characters /;tn'
sed -e :n -e '$!N;/"$/{$!bn' -e '};s/"[^"]*"\n<[^>]*>/other characters /g'
Cả ba đều xây dựng trên s///lệnh ubstlation cơ bản :
s/"[^"]*"\n<[^>]*>/other characters /
Tất cả họ cũng cố gắng cẩn thận trong việc xử lý dòng cuối cùng, vì seds có xu hướng khác nhau về đầu ra của họ trong các trường hợp cạnh. Đây là ý nghĩa của $!một địa chỉ phù hợp với mọi dòng !không phải là $cuối cùng.
Tất cả chúng cũng sử dụng Nlệnh ext để nối dòng đầu vào tiếp theo vào không gian mẫu theo \nký tự ewline. Bất cứ ai đã làm sedviệc trong một thời gian sẽ học được cách dựa vào \nnhân vật ewline - bởi vì cách duy nhất để có được một người rõ ràng là đặt nó ở đó.
Cả ba đều thực hiện một số nỗ lực để đọc càng ít đầu vào càng tốt trước khi thực hiện hành động - sedhành động ngay khi có thể và không cần đọc trong toàn bộ tệp đầu vào trước khi thực hiện.
Mặc dù họ làm tất cả N, cả ba đều khác nhau về phương pháp đệ quy.
Lệnh đầu tiên
Lệnh đầu tiên sử dụng một N;P;Dvòng lặp rất đơn giản . Ba lệnh này được tích hợp sẵn cho bất kỳ tương thích POSIX nào sedvà chúng bổ sung cho nhau một cách độc đáo.
N- như đã đề cập, nối thêm Ndòng đầu vào ext vào không gian mẫu theo \ndấu phân cách ewline được chèn .
P- thích p; nó Pgợi ý không gian mẫu - nhưng chỉ tối đa đến \nký tự ewline xuất hiện đầu tiên . Và do đó, đưa ra đầu vào / lệnh sau:
printf %s\\n one two | sed '$!N;P;d'
sed Pgợi ý chỉ một . Tuy nhiên, với ...
D- thích d; nó Dxóa bỏ không gian mẫu và bắt đầu một chu trình dòng khác. Không giống như d , Dchỉ xóa tối đa \newline xuất hiện đầu tiên trong không gian mẫu. Nếu có nhiều hơn trong không gian mẫu theo \nký tự ewline, hãy sedbắt đầu chu trình dòng tiếp theo với những gì còn lại. Nếu dví dụ trước được thay thế bằng a D, ví dụ, sedsẽ Print cả một và hai .
Lệnh này chỉ đệ quy cho các dòng không khớp với s///tuyên bố ubstlation. Bởi vì s///ubstlation loại bỏ \newline được thêm vào N, không bao giờ có bất cứ điều gì còn lại khi sed Dxóa bỏ không gian mẫu.
Các thử nghiệm có thể được thực hiện để áp dụng Pvà / hoặc Dchọn lọc, nhưng có các lệnh khác phù hợp hơn với chiến lược đó. Bởi vì đệ quy được triển khai để xử lý các dòng liên tiếp chỉ khớp với một phần của quy tắc thay thế, các chuỗi liên tiếp khớp với cả hai đầu của s///ubstlation không hoạt động tốt.:
Cho đầu vào này:
first "line"
<second>"line"
<second>"line"
<second>line and so on
... nó in ...
first other characters "line"
<second>other characters line and so on
Nó, tuy nhiên, xử lý
first "line"
second "line"
<second>line
...bình thường.
Bộ chỉ huy thứ hai
Lệnh này rất giống với lệnh thứ ba. Cả hai đều sử dụng nhãn :branch / test (như được thể hiện trong câu trả lời của Joeseph R. ở đây ) và tái diễn lại với điều kiện nhất định.
-e :n -e- sedtập lệnh di động sẽ phân định một :định nghĩa nhãn bằng \newline hoặc -ecâu lệnh xecut nội tuyến mới .
:n- định nghĩa một nhãn có tên n. Điều này có thể được trả lại cho bất cứ lúc nào với một trong hai bnhoặc tn.
tn- tlệnh est trở về nhãn đã chỉ định (hoặc, nếu không được cung cấp, thoát khỏi tập lệnh cho chu kỳ dòng hiện tại) nếu bất kỳ s///ubstlation nào kể từ khi nhãn được xác định hoặc do lần cuối được gọi là tests thành công.
Trong lệnh này, đệ quy xảy ra cho các dòng khớp. Nếu sedthay thế thành công mẫu bằng các ký tự khác , sedquay lại :nnhãn và thử lại. Nếu một s///ubstlation không được thực hiện tự động sedin không gian mẫu và bắt đầu chu kỳ dòng tiếp theo.
Điều này có xu hướng xử lý các chuỗi liên tiếp tốt hơn. Trường hợp cuối cùng thất bại, bản in này:
first other characters other characters other characters line and so on
Bộ ba
Như đã đề cập, logic ở đây rất giống với cuối cùng, nhưng thử nghiệm rõ ràng hơn.
/"$/bn- đây là sedbài kiểm tra. Vì blệnh ranch là một chức năng của địa chỉ này, nên sedsẽ chỉ bquay lại :nsau khi một \newline được nối thêm và không gian mẫu vẫn kết thúc bằng một "trích dẫn kép.
Có rất ít được thực hiện giữa Nvà bcàng tốt - theo cách này sedcó thể nhanh chóng thu thập chính xác càng nhiều đầu vào càng cần thiết để đảm bảo rằng dòng sau không thể phù hợp với quy tắc của bạn. Các s///ubstlation khác nhau ở đây ở chỗ nó sử dụng gcờ thùy - và do đó, nó sẽ thực hiện tất cả các thay thế cần thiết cùng một lúc. Cho đầu vào giống hệt lệnh này đầu ra giống hệt đến cuối cùng.
\ntuyên bố ewline bạn thực hiện là lý do tại sao tôi hỏi. mọi người hiếm khi hỏi liệu họ có thể làms//\n/như bạn có thể với GNU hay khôngsed, mặc dù hầu hết những người khácsedsẽ từ chối lối thoát đó ở phía bên tay phải. Tuy nhiên,\nlối thoát sẽ hoạt động ở bên trái trong bất kỳ POSIX nàosedvà bạn có thể dịch chúng một cách hợp lý như thếy/c/\n/mặc dù nó sẽ có tác dụng tương tựs/c/\n/gvà vì vậy không phải lúc nào cũng hữu ích.