Grep, найди строки с точным количеством подходящих образцов - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу найти и перечислить строки в текстовом файле, которые содержат только два слова длиной не более четырех символов.

Я могу найти слова из четырех символов или более с помощью:

grep '[A-Za-z][A-Za-z][A-Za-z][A-Za-z][A-Za-z]*' file.txt

но как я могу ограничить вывод, чтобы показывать только строки с двумя такими словами?

Любые подсказки (не обязательно ответ)?

спасибо

ОБНОВЛЕНИЕ: Спасибо.Следуя вашему совету, я теперь с:

egrep '([A-Za-z]){4,}' file.txt

В нем перечислены все строки с выделенными словами длиной 4+ буквы.Теперь мне осталось только отфильтровать его, чтобы показать только строки, в которых такие слова (длиной 4+ буквы) встречаются дважды.Есть намеки?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

1-й: я рекомендую использовать \ w (letter) для буквы, это чище.
2-й: Чтобы сгруппировать ваш шаблон в один токен, используйте (), чтобы найти несколько копий токена регулярного выражения, используйте {}.(см. шпаргалку)
3-й: В этом случае ваш разделитель является пробелом, поэтому я бы использовал \s, так как я предполагаю, что вы, возможно, захотите поймать такие вещи, как вкладки.Но это на ваше усмотрение.

Примечание: я рекомендую избегать *, если у вас нет сильного разделителя (например, .* будет жадно соответствовать концу вашей строки).

Шпаргалка: https://www.rexegg.com/regex-quickstart.html

0 голосов
/ 30 сентября 2018

Просто используйте 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 или более символов слова, встречающихся как минимум два раза, что являетсясовсем другая и гораздо более простая задача.

0 голосов
/ 28 сентября 2018

Чтобы найти два экземпляра PATTERN, используйте:

PATTERN.*PATTERN

Если вы используете grep -E, вы можете использовать фигурные скобки, чтобы избежать повторения:

grep -E '(.*PATTERN){2,}'

(Выможет также применить тот же трюк, чтобы избежать повторения [A-Za-z] в вашем шаблоне.)

Вы можете использовать \< и \>, чтобы соответствовать началу и концу слов, чтобы убедиться, что 8-буквенные слова не верны 'Обнаружено как два 4-х буквенных слова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...