Каково наиболее эффективное использование grep без учета регистра?

Моя цель — сопоставить адреса электронной почты, принадлежащие Yahoo! семейство доменов. В системах *nix (я буду использовать Ubuntu), каковы преимущества и недостатки любого из этих методов сопоставления с шаблоном?

И если есть другое, более элегантное решение, которое я не смог придумать, поделитесь им.

Они здесь:

  • Используйте grep с опцией -i:

grep -Ei "@(yahoo|(y|rocket)mail|geocities)\.com"

  • Переведите символы во все прописные или строчные буквы, затем grep:

tr [:upper:] [:lower:] < /path/to/file.txt | grep -E "@(yahoo|(y|rocket)mail|geocities)\.com"

  • Включите набор символов для каждого символа в шаблоне (ниже, конечно, не будет соответствовать чему-то вроде «@rOcketmail.com», но вы понимаете, что получится, если я проверю каждый символ на регистр):

grep -E "@([yY]ahoo|([yY]|[rR]ocket)[mM]ail|[gG]eo[cC]ities)\.[cC][oO][mM]" /path/to/file.txt


person sblack89    schedule 07.04.2014    source источник
comment
Это не составит труда проверить. Ты это пробовал?   -  person    schedule 08.04.2014
comment
Вы пробовали проводить бенчмаркинг? Я подозреваю, что ваш первый образец будет самым быстрым. Я ожидаю, что эта проблема, скорее всего, будет ограничена файловым вводом-выводом, чем скоростью обработки... поскольку она линейна по размеру ввода. Остерегайтесь микрооптимизации.   -  person Floris    schedule 08.04.2014
comment
Одна вещь, которую вы, возможно, захотите иметь в виду, это то, что захват групп может быть дорогим. Если вам не нужно возвращать сгруппированные значения, рассмотрите возможность использования вместо этого (?:).   -  person CAustin    schedule 08.04.2014


Ответы (1)


grep -i оказался значительно медленнее, чем перевод в более низкие значения перед сбором, поэтому в итоге я использовал вариант № 2.

Спасибо @mike-w за напоминание о том, что простой тест имеет большое значение.

person sblack89    schedule 21.04.2014
comment
И спасибо, что поделились со всеми нами результатами своих тестов! - person Dan Bechard; 06.06.2016
comment
Не могли бы вы дать определение «значительному»? Если бы один путь занял 10 секунд, а другой — 30 секунд, будучи «значительным», это позволило бы сделать собственное суждение на основе нагрузки на сервер, пересечения каталогов, времени на создание регулярного выражения и т. д., какой метод попробовать. - person wruckie; 22.08.2018
comment
Я не собираюсь возвращаться к тесту на данный момент, но вы делаете правильный вывод, и было бы неплохо количественно оценить разницу. - person sblack89; 13.09.2018