Cách di động để làm điều này - và cách hiệu quả hơn - là với các địa chỉ. Bạn có thể làm được việc này:
printf %s\\n cat dog pear banana cat dog |
sed -e '/cat/!{/dog/!b' -e '};cBear'
Theo cách này, nếu dòng không chứa chuỗi mèo và không chứa chuỗi chó sed
b
xuất ra khỏi tập lệnh, hãy tự động in lại dòng hiện tại của nó và kéo vào tiếp theo để bắt đầu chu kỳ tiếp theo. Do đó, nó không thực hiện hướng dẫn tiếp theo - trong ví dụ này c
treo toàn bộ dòng để đọc Bear nhưng nó có thể làm bất cứ điều gì.
Có lẽ đáng chú ý thêm rằng mọi tuyên bố sau khi !b
ở chỗ sed
lệnh có thể chỉ phù hợp trên một dòng có chứa một trong hai chuỗi dog
hay cat
- vì vậy bạn có thể thực hiện xét nghiệm chuyên sâu mà không cần bất kỳ nguy cơ phù hợp với một dòng mà không - có nghĩa là bây giờ bạn có thể áp dụng quy tắc chỉ một hoặc khác là tốt.
Nhưng đó là tiếp theo. Đây là đầu ra từ lệnh trên:
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
Bạn cũng có thể triển khai một bảng tra cứu với các phản hồi.
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ cat dog /;x
};G;s/^\(.*\)\n.* \1 .*/Bear/;P;d'
Việc thiết lập cho trường hợp ví dụ đơn giản này sẽ tốn nhiều công sức hơn, nhưng sed
về lâu dài có thể tạo ra các tập lệnh linh hoạt hơn nhiều .
Trong dòng đầu tiên, tôi x
thay đổi không gian giữ và không gian mẫu sau đó chèn chuỗi <space>
con <space>
chó mèo<space>
vào không gian giữ trước khi e x
thay đổi chúng trở lại.
Từ đó trở đi, trên mỗi dòng tiếp theo, tôi G
và không gian được nối vào không gian mẫu, sau đó kiểm tra xem liệu tất cả các ký tự từ đầu dòng cho đến dòng mới tôi vừa thêm vào cuối có khớp với một chuỗi được bao quanh bởi khoảng trắng sau nó không. Nếu vậy tôi thay thế toàn bộ lô bằng Bear và nếu không thì không có tác hại gì vì tôi P
chỉ tiếp tục đến dòng mới xuất hiện đầu tiên trong không gian mẫu sau đó d
xóa bỏ tất cả.
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
Và khi tôi nói linh hoạt, tôi có nghĩa là nó. Ở đây, nó sẽ thay thế con mèo bằng BrownBear và con chó bằng BlackBear :
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ 1cat Brown 2dog Black /;x
};G;s/^\(.*\)\n.* [0-9]\1 \([^ ]*\) .*/\2Bear/;P;d'
###OUTPUT###
BrownBear
BlackBear
pear
banana
BrownBear
BlackBear
Tất nhiên bạn có thể mở rộng rất nhiều về nội dung của bảng tra cứu - Tôi đã chọn ý tưởng từ các email sử dụng của Greg Ubben về chủ đề này, vào những năm 90, ông mô tả cách ông xây dựng một máy tính thô sơ trong một sed s///
tuyên bố.
-r
tùy chọn này dưới dạng từ đồng nghĩa về-E
khả năng tương thích với GNU sed. OpenBSD và OS Xsed -E
sẽ giải thích đường ống thoát là đường ống theo nghĩa đen, không phải là toán tử thay thế. Đây là một liên kết hoạt động đến trang người dùng NetBSD và đây là một liên kết cho OpenBSD chưa được mười năm tuổi.