Với các greptriển khai hỗ trợ các biểu thức chính quy như perl (như pcregrephoặc GNU hoặc ast-open grep -P), bạn có thể thực hiện điều đó trong một lệnh grepgọi với:
grep -P '^(?=.*pat1)(?!.*pat2)|^(?=.*pat2)(?!.*pat1)'
Đó là tìm các dòng phù hợp pat1nhưng không pat2, hoặc pat2không pat1.
(?=...)và (?!...)tương ứng nhìn về phía trước và tiêu cực nhìn phía trước các nhà khai thác. Vì vậy, về mặt kỹ thuật, phần trên tìm kiếm phần đầu của chủ đề ( ^) miễn là nó được theo sau .*pat1và không theo sau .*pat2, hoặc tương tự với pat1và pat2đảo ngược.
Đó là tối ưu cho các dòng có chứa cả hai mẫu khi chúng sẽ được tìm kiếm hai lần. Thay vào đó, bạn có thể sử dụng các toán tử perl nâng cao hơn như:
grep -P '^(?=.*pat1|())(?(1)(?=.*pat2)|(?!.*pat2))'
(?(1)yespattern|nopattern)phù hợp với yespatternnếu nhóm bắt 1st (trống ()ở trên) khớp, và nopatternnếu không. Nếu điều đó ()phù hợp, điều đó có nghĩa là pat1không phù hợp, vì vậy chúng tôi tìm kiếm pat2(nhìn tích cực về phía trước) và chúng tôi tìm kiếm không pat2 khác (nhìn tiêu cực về phía trước).
Với sed, bạn có thể viết nó:
sed -ne '/pat1/{/pat2/!p;d;}' -e '/pat2/p'
[a-z][a-z0-9]\(,7\}\(\.[a-z0-9]\{,3\}\)+nào? (2) Điều gì xảy ra nếu một trong những từ / mẫu xuất hiện nhiều lần trong một dòng (và một từ khác không xuất hiện)? Là từ đó tương đương với từ xuất hiện một lần, hoặc nó được tính là nhiều lần xuất hiện?