grep & ldquo; + & rdquo; оператор не работает

Этот

ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.log."

выводит это:

alternatives.log.1
alternatives.log.10.gz
alternatives.log.2.gz
alternatives.log.3.gz
alternatives.log.4.gz
alternatives.log.5.gz
alternatives.log.6.gz
alternatives.log.7.gz
alternatives.log.8.gz
alternatives.log.9.gz
apport.log.1
apport.log.2.gz
apport.log.3.gz

, но это:

ls -l /var/log | awk '{print $9}' | grep "^[a-z]+\.log."

ничего не выводит.

Почему? Я просто изменил * на +. Разве это не похоже? Оператору + требуется хотя бы одно совпадение, а * - ноль или более.

1
задан 9 May 2013 в 22:53

1 ответ

Чтобы уточнить ответ MiJyns, «специальные символы», такие как +, также работают в стандартном регулярном выражении, но вам нужно избегать их обратным слэшем. Вы можете сказать, что ожидания по умолчанию меняются между стандартным и расширенным регулярными выражениями:

В стандартном регулярном выражении символы соответствуют буквально по умолчанию. Например, в grep "ab+" символ + является литералом +. Регулярное выражение, например, найдет «ab + ab», но не «abbbb». Чтобы использовать «особый смысл» +, вам нужно избежать этого. Таким образом, grep "ab\+" найдет «abbb», но не «ab + ab». Потому что в последнем примере символ + интерпретируется как квантификатор «один или многие из них», в этом случае «один или несколько b».

В расширенном регулярном выражении это совсем наоборот. Здесь вам нужно избегать «специальных символов», которые нужно обрабатывать буквально. Поэтому grep -E "ab+" находит «abbb», но не «ab + ab». Если вы избегаете +, это получается буквально. Поэтому grep -E "ab\+" находит «ab + ab», но не «abbb».

8
ответ дан 24 May 2018 в 22:25
  • 1
    Какой унылый беспорядок ... ;-), как магия и сверхмагический re в vim. Urgh. Цена за обратную совместимость ... – Rmano 9 November 2015 в 14:32

Другие вопросы по тегам:

Похожие вопросы: