Chris Down đã chỉ ra làm thế nào bạn có thể có được một biểu thức khác cho biểu thức chính quy bằng cách sử dụng câu lệnh 'if' rõ ràng trong một khối. Bạn cũng có thể nhận được hiệu quả tương tự theo một số cách khác, mặc dù giải pháp của anh ấy có lẽ tốt hơn.
Một là viết một biểu thức chính thứ ba sẽ chỉ khớp với văn bản không khớp với những người khác, trong trường hợp của bạn, điều này sẽ trông giống như thế này:
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
Lưu ý, điều này sử dụng regexps neo - ^ ở đầu regexps sẽ chỉ khớp ở đầu dòng - các mẫu ban đầu của bạn không làm điều này, điều này làm chậm sự khớp một chút vì nó sẽ kiểm tra tất cả các ký tự trên một dòng thay vì bỏ qua cho đến dòng tiếp theo Trường hợp thứ ba ("khác") sẽ khớp với một dòng bắt đầu bằng một số ký tự không phải là 'R' ([^ R]) hoặc bắt đầu bằng 'R' theo sau là một ký tự không phải là '1' hoặc ' 2 '(R [^ 12]). Hai ý nghĩa khác nhau của ^ có phần khó hiểu, nhưng sai lầm đó đã được thực hiện từ lâu và sẽ không được thay đổi bất cứ lúc nào sớm.
Để sử dụng các biểu thức bổ sung, chúng thực sự cần phải được neo, vì nếu không thì [^ R] sẽ khớp với ví dụ 1 theo sau nó. Đối với các biểu thức chính đơn giản như bạn có, cách tiếp cận này có thể hữu ích, nhưng khi các biểu thức chính trở nên phức tạp hơn, cách tiếp cận này sẽ trở nên khó kiểm soát. Thay vào đó, bạn có thể sử dụng các biến trạng thái cho mỗi dòng, như thế này:
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
Bộ này được xử lý về 0 cho mỗi dòng mới, sau đó thành 1 nếu nó khớp với một trong hai biểu thức chính, và cuối cùng, nếu nó vẫn bằng 0, thực hiện in $ 0.