Tham chiếu trở lại không hợp lệ bằng grep


9

Vì vậy, tôi đang cố gắng tìm các từ có 6 chữ cái bao gồm một ký tự được lặp lại ba lần, sau đó là một ký tự khác được lặp lại ba lần. Ví dụ aaabbbhay oookkk.

Tôi đang cố gắng:

grep -E "[a-z]\1{3}\S[a-z]\1{3}" filename

Đầu tiên, regex có đúng không? Thứ hai tại sao tôi nhận được grep: Invalid back reference?


1
Hãy giải thích chính xác những gì bạn cần để phù hợp. Regex của bạn không chính xác vì vậy tôi không thể hiểu bạn là gì sau đó. Bạn đang tìm kiếm những từ bao gồm 3 lần lặp lại của một nhân vật và sau đó là ba lần lặp lại của một nhân vật khác? Hay bạn cũng muốn phù hợp aaabbbfoobar? Thế còn aaaabbb? Lý tưởng nhất, cho chúng tôi thấy một số ví dụ đầu vào và đầu ra mong muốn của bạn.
terdon

1
Một phản hồi nên đề cập đến một cái gì đó, và bạn đã không chỉ định đó là cái gì. Thông thường bạn nhóm một biểu thức bằng cách sử dụng dấu ngoặc đơn để làm như vậy. Ví dụ: grep -E '([a-z]{2})([0-9]{2})\2\1'sẽ phù hợp aa9999aa.
muru

@terdon Bạn đang tìm kiếm những từ bao gồm 3 lần lặp lại của một nhân vật và sau đó là ba lần lặp lại của một nhân vật khác? Đúng. Hay bạn cũng muốn kết hợp aaabbbfoobar? Không. Chỉ những từ như oookkk(không quá 6 ký tự) KHÔNG phải những từ có chứa oookkklikeoookkkfoobar
Điểm nổi bật Factory

@HighlightFactory OK, trong trường hợp đó, hãy sử dụng grep -wví dụ tôi đã đưa ra trong câu trả lời của mình.
terdon

Một điều nữa, bạn cũng muốn khớp aaaaaahay bạn cần ít nhất hai nhân vật khác nhau? Vui lòng xem xét cho chúng tôi ví dụ đầu vào và đầu ra mong muốn.
terdon

Câu trả lời:


12

Không, nó không đúng. Tôi không biết những gì \1{3}được cho là nhưng đó là những gì gây ra vấn đề cho bạn. Nếu bạn muốn tìm các dòng chứa ba ký tự lặp lại theo sau bởi ba ký tự lặp lại khác, bạn có thể sử dụng dòng này:

grep -E '([a-z])\1{2}([a-z])\2{2}'

Đề \1cập đến nhóm bị bắt đầu tiên . Bạn có thể chụp các nhóm bằng cách sử dụng dấu ngoặc đơn. Sau đó, \1là nhóm đầu tiên như vậy và \2là nhóm thứ hai và như vậy. Vì bạn không có nhóm nào bị bắt, grepđã phàn nàn về một tài liệu tham khảo không hợp lệ vì nó không có gì để tham khảo. Vì vậy, trong regex ở trên, dấu ngoặc đơn đang bắt hai nhóm. Sau đó, bạn muốn {2}và không phải {3}vì trận đấu ban đầu cũng được tính.

Bạn không chỉ định liệu bạn cần kết hợp thành một từ hay bạn cũng muốn khớp trong các từ. Nếu bạn muốn toàn bộ từ khớp (và loại trừ những thứ như aaaabbb, thay vào đó hãy sử dụng từ này:

grep -wE '([a-z])\1{2}([a-z])\2{2}'

Để chỉ in phần phù hợp của dòng (từ) chứ không phải toàn bộ dòng, hãy sử dụng (chỉ GNU grep):

grep -owE '([a-z])\1{2}([a-z])\2{2}'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.