Я должен создать регулярное выражение, которое отфильтрует группу слов, которая начинает и заканчивается тем же словом. Например, the life of the free
произведет the life of the
и he was and he his the same
произведет he was and he
. Эти два слова должны быть максимальными 10 символов друг от друга.
Попробуйте grep
расширенным регулярным выражением:
$ echo "the life of the free" | grep -Eo "(\b[[:alnum:]]+\b)([[:blank:]]|[[:alnum:]]){1,10}\1"
the life of the
$ echo "he was and he his the same" | grep -Eo "(\b[[:alnum:]]+\b)([[:blank:]]|[[:alnum:]]){1,10}\1"
he was and he
Здесь -E
средства расширенный regexp, -o
средства только печатают подобранную часть строки, \b
соответствия граница слова, класс символов [[:alnum:]]
средства все алфавитные (верхний регистр & нижний регистр) и числовые символы, [[:blank:]]
пространство средств или вкладка, +
средства одни или несколько случаев предыдущего соответствия, {1,10}
предыдущее соответствие может произойти между 1 максимум с 10 раз, \1
, средства соответствуют первой подобранной группе (выраженный между первой парой круглых скобок) т.е. \b[[:alnum:]]+\b
.
С PCRE можно сделать:
grep -Po '\b(\w+)\b.{1,10}\b\1\b'
-P
включает регулярные выражения стиля Perl с помощью PCRE. -o
печать только подобранный текст. \b
метки граница слова (\w+)
группы соответствие словесных символов .{1,10}
соответствия до 10 символов и по крайней мере 1. \1
относится к группе, подобранной ранее.