Просто используйте awk, чтобы вам не приходилось придумывать какие-то замысловатые регулярные выражения, чтобы сделать все сразу.В GNU awk для границ слов и в предположении, что ваши «слова» содержат только буквенные символы, как в опубликованном вами скрипте:
awk 'gsub(/\<[[:alpha:]]{4,}\>/,"&") == 2'
Вышеприведенное, конечно, не проверено, поскольку вы не предоставили пример ввода / вывода длянам проверить.
РЕДАКТИРОВАТЬ: Вот решение, приведенное на стр. 216 в тексте, на который вы ссылались в комментариях к упражнению 7.5 на стр. 100, на котором вы основали свойвопрос о:
egrep '(\<[A-Za-z]{4,}\>).*\<\1\>' file
Давайте сначала очистим это, чтобы удалить устаревший egrep и заменим списки символов переносимым классом символов:
grep -E '(\<[[:alpha:]]{4,}\>).*\<\1\>' file
Теперь у вас есть скрипт, которыйвместо того, чтобы искать строки, которые содержат only two words that are four characters or more
, как указано в вашем вопросе, ищет строки, которые содержат одно и то же 4 или более символов слова, встречающихся как минимум два раза, что являетсясовсем другая и гораздо более простая задача.