Почему делают эти регулярные выражения в grep ведут себя странно?

Я хотел играть немного с a grep команда с помощью регулярных выражений и узнает, что они ведут себя по-другому по сравнению с тем, что я ожидал. Например, для файла temp со следующим содержанием

helloworld 
hello_world
hello world
hello how are you world
hello wor   ld
hello_*_..world 
helloEworld

когда я работаю

grep 'hello.*world' temp

это возвращается

helloworld 
hello_world
hello world
hello how are you world
hello_*_..world 
helloEworld

как ожидалось. Но когда я работаю

grep 'hello.+world' temp

это ничего не возвращает... Хотя, когда добавляют \ прежде +

grep 'hello.\+world' temp

это дает корректный ответ

hello_world
hello world
hello how are you world
hello_*_..world 
helloEworld

при добавлении \ прежде * в предыдущей команде и выполнении

grep 'hello.\*world' temp

возвраты ничто...

Почему эта команда grep 'hello.+world' temp не работает тогда как с \ работает. И почему это - точно противоположное для *? Когда должен я использовать \?

1
задан 12 January 2015 в 18:19

1 ответ

Существуют различные классы регулярных выражений что GNU grep поддержки:

  • Основные регулярные выражения (BRE) - значение по умолчанию. Не поддерживает + непосредственно, но действительно поддерживает *. Можно сделать + имейте смысл при выходе из него \+. От GNU grep документация:

    In basic regular expressions the meta-characters ‘?’, ‘+’, ‘{’, ‘|’,
    ‘(’, and ‘)’ lose their special meaning; instead use the backslashed
    versions ‘\?’, ‘\+’, ‘\{’, ‘\|’, ‘\(’, and ‘\)’.
    
  • Расширенные регулярные выражения (ERE) - опция -E включает это. Поддержки оба + и * непосредственно.

  • Совместимые с Perl регулярные выражения (PCRE) - -P опция включает PCRE. Синтаксис поддержек, подобный Perl, такому как предвидения и lookbehinds.

BRE и ДО являются обычно определяемыми POSIX стандартными классами, таким образом, необходимо найти их на любом grep который стремится к совместимости POSIX, и ожидайте вести себя так же.

4
ответ дан 3 December 2019 в 07:03

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

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