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."

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

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

31
задан 9 May 2013 в 21:53

2 ответа

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

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

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

0
ответ дан 9 May 2013 в 21:53

Это потому, что grep (без каких-либо аргументов) работает только со стандартными регулярными выражениями. + является частью расширенных регулярных выражений, поэтому, чтобы использовать это, вам нужно использовать grep -E или egrep:

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

Кроме того, вы можете просто сделать это, если не хотите использовать расширенные регулярные выражения:

ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."
0
ответ дан 9 May 2013 в 21:53

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

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