Я хотел играть немного с 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
не работает тогда как с \
работает. И почему это - точно противоположное для *
? Когда должен я использовать \
?
Существуют различные классы регулярных выражений что 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
включает это. Поддержки оба +
и *
непосредственно.
-P
опция включает PCRE. Синтаксис поддержек, подобный Perl, такому как предвидения и lookbehinds.BRE и ДО являются обычно определяемыми POSIX стандартными классами, таким образом, необходимо найти их на любом grep
который стремится к совместимости POSIX, и ожидайте вести себя так же.