Поэтому я пытаюсь найти 6-буквенные слова, состоящие из одного символа, повторенного три раза, а затем другого символа, повторенного три раза. Например aaabbb
или oookkk
.
Я стараюсь:
grep -E "[a-z]\1{3}\S[a-z]\1{3}" filename
Во-первых, правильное ли регулярное выражение? Во-вторых, почему я получаю grep: Invalid back reference
?
command-line
grep
regular-expression
Основные заводские
источник
источник
aaabbbfoobar
? Как насчетaaaabbb
? В идеале покажите нам пример ввода и желаемый результат.grep -E '([a-z]{2})([0-9]{2})\2\1'
будет соответствоватьaa9999aa
.oookkk
(не более 6 символов), а не слова, содержащиеoookkk
какoookkkfoobar
grep -w
пример, который я привел в своем ответе.aaaaaa
или вам нужно по крайней мере два разных персонажа? Пожалуйста, подумайте над тем, чтобы дать нам пример ввода и желаемого результата.Ответы:
Нет, это не правильно. Я понятия не имею, что
\1{3}
должно быть, но именно это вызывает у вас проблемы. Если вы хотите найти строки, которые содержат три повторяющихся символа, за которыми следуют три других повторяющихся символа, вы можете использовать это:\1
Относится к первой захваченной группе. Вы можете захватить группы с помощью скобок. Тогда\1
это первая такая группа,\2
вторая и так далее. Поскольку у вас не было захваченных групп, выgrep
жаловались на недопустимую ссылку, поскольку на нее было нечего ссылаться. Итак, в приведенном выше регулярном выражении круглые скобки охватывают две группы. Затем, вы хотите,{2}
а не{3}
так как начальное совпадение также считается.Вы не указываете, хотите ли вы, чтобы совпадение было словом или вы также хотите совпадать в словах. Если вы хотите, чтобы все слова соответствовали (и исключали такие вещи, как
aaaabbb
, используйте это вместо:Чтобы напечатать только совпадающую часть строки (слово), а не всю строку, используйте (только GNU grep):
источник