É como ?
em muitos outros mecanismos de expressões regulares e significa "corresponder a zero ou a um dos que vieram antes dele".
No seu exemplo, o \?
é aplicado ao [ -]
, o que significa que ele corresponde a um espaço ou a menos, mas o espaço ou o sinal de menos é opcional.
Então, qualquer um deles corresponderá:
555 1234
555-1234
5551234
A razão pela qual é escrita como \?
em vez de ?
é para compatibilidade com versões anteriores.
A versão original de grep
usava um tipo diferente de expressão regular chamada "expressão regular básica", em que ?
significava apenas um ponto de interrogação literal.
Para que o GNU grep pudesse ter a funcionalidade zero ou uma, eles o adicionaram, mas tiveram que usar a sintaxe \?
para que os scripts que usaram ?
ainda funcionassem como esperado.
Note que o grep tem uma opção -E
que o faz usar o tipo mais comum de expressão regular, chamado "expressões regulares estendidas".
man 1 grep
:
-E, --extended-regexp
Interpret PATTERN as an extended regular expression
(ERE, see below). (-E is specified by POSIX.)
-G, --basic-regexp
Interpret PATTERN as a basic regular expression (BRE, see below).
This is the default.
...
Repetition
A regular expression may be followed by one of several repetition operators:
? The preceding item is optional and matched at most once.
...
grep understands three different versions of regular expression syntax:
“basic,” “extended” and “perl.”
...
Basic vs Extended Regular Expressions
In basic regular expressions the meta-characters ?, +, {, |, (, and )
lose their special meaning; instead use the backslashed versions
\?, \+, \{, \|, \(, and \).
Mais informações: