Неверная обратная ссылка с использованием grep

9

Поэтому я пытаюсь найти 6-буквенные слова, состоящие из одного символа, повторенного три раза, а затем другого символа, повторенного три раза. Например aaabbbили oookkk.

Я стараюсь:

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

Во-первых, правильное ли регулярное выражение? Во-вторых, почему я получаю grep: Invalid back reference?

Основные заводские
источник
1
Пожалуйста, объясните, что именно вам нужно для соответствия. Ваше регулярное выражение неверно, поэтому я не могу понять, что вы после. Вы ищете слова, которые состоят из 3 повторений одного символа и затем трех повторений другого? Или вы тоже хотите соответствовать aaabbbfoobar? Как насчет aaaabbb? В идеале покажите нам пример ввода и желаемый результат.
Terdon
1
Обратная ссылка должна ссылаться на что-то, а вы не указали, что это такое. Обычно вы группируете выражение, используя для этого скобки. Например: grep -E '([a-z]{2})([0-9]{2})\2\1'будет соответствовать aa9999aa.
Муру
@terdon Вы ищете слова, которые состоят из 3 повторений одного символа и затем трех повторений другого? Да. Или вы тоже хотите соответствовать aaabbbfoobar? Нет. Только такие слова, как oookkk(не более 6 символов), а не слова, содержащие oookkkкакoookkkfoobar
Highlights Factory
@HighlightsFactory Хорошо, в этом случае используйте grep -wпример, который я привел в своем ответе.
Тердон
Еще одна вещь, вы также хотите соответствовать aaaaaaили вам нужно по крайней мере два разных персонажа? Пожалуйста, подумайте над тем, чтобы дать нам пример ввода и желаемого результата.
Terdon

Ответы:

12

Нет, это не правильно. Я понятия не имею, что \1{3}должно быть, но именно это вызывает у вас проблемы. Если вы хотите найти строки, которые содержат три повторяющихся символа, за которыми следуют три других повторяющихся символа, вы можете использовать это:

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

\1Относится к первой захваченной группе. Вы можете захватить группы с помощью скобок. Тогда \1это первая такая группа, \2вторая и так далее. Поскольку у вас не было захваченных групп, вы grepжаловались на недопустимую ссылку, поскольку на нее было нечего ссылаться. Итак, в приведенном выше регулярном выражении круглые скобки охватывают две группы. Затем, вы хотите, {2}а не {3}так как начальное совпадение также считается.

Вы не указываете, хотите ли вы, чтобы совпадение было словом или вы также хотите совпадать в словах. Если вы хотите, чтобы все слова соответствовали (и исключали такие вещи, как aaaabbb, используйте это вместо:

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

Чтобы напечатать только совпадающую часть строки (слово), а не всю строку, используйте (только GNU grep):

grep -owE '([a-z])\1{2}([a-z])\2{2}'
Тердон
источник