это
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."
ничего не выводит.
Зачем? Я только что изменился *
на +
. Разве это не похоже? Оператору +
просто нужно хотя бы одно совпадение и *
ноль или более.
Чтобы уточнить ответ MiJyns, «специальные символы», такие как +, также работают в стандартном регулярном выражении, но вы должны избегать их с обратной косой чертой. Можно сказать, что ожидания по умолчанию полностью изменены между стандартным и расширенным регулярным выражением:
В стандартном регулярном выражении символы совпадают буквально по умолчанию. Например, в
grep "ab+"
+ это литерал +. Например, регулярное выражение найдет «ab + ab», но не «abbbb». Чтобы использовать «особое значение» +, вам нужно избежать его. Такgrep "ab\+"
что нашел бы «abbb», но не «ab + ab» больше. Потому что в последнем примере знак + интерпретируется как квантификатор «один или много из этого», в этом случае «один или много b».В расширенном регулярном выражении все наоборот. Здесь вам нужно избегать «специальных символов», чтобы относиться к ним буквально. Так что
grep -E "ab+"
находит «abbb», но не «ab + ab». Если вы выберете +, это будет соответствовать буквально. Так чтоgrep -E "ab\+"
находит "ab + ab", но не "abbb".источник