Diferentes ferramentas e versões suportam diferentes variantes de expressões regulares. A documentação de cada um lhe dirá o que eles suportam.
Existem padrões para que se possa confiar em um conjunto mínimo de recursos disponíveis em todos os aplicativos em conformidade.
Por exemplo, todas as implementações modernas de sed
e grep
implementam expressões regulares básicas como especificado pelo POSIX (pelo menos uma versão ou outra do padrão, mas esse padrão não evoluiu muito nesse aspecto no últimas décadas).
No POSIX BRE e ERE, você tem a classe de caractere [:alnum:]
. Isso corresponde a letras e dígitos em sua localidade (observe que geralmente inclui muito mais do que a-zA-Z0-9
, a menos que a localidade seja C).
Então:
grep -x '[[:alnum:]_]\{1,\}'
corresponde a um ou mais alnums ou _.
[\w]
é exigido pelo POSIX para corresponder à barra invertida ou w
. Portanto, você não encontrará uma implementação de grep
ou sed
onde estiver disponível (a menos que seja por meio de opções não padrão).
O comportamento para \w
sozinho não é especificado por POSIX, portanto, as implementações podem fazer o que quiserem. O GNU grep
adicionou isso há muito tempo.
GNU grep
costumava ter seu próprio mecanismo regexp, mas agora ele usa o GNU libc (apesar de incorporar sua própria cópia).
Pretende corresponder aos alnums e sublinhados na sua região. No entanto, atualmente ele tem um bug, pois ele só corresponde a caracteres de byte único (por exemplo, não é em uma localidade UTF-8, embora seja claramente uma letra e mesmo que seja compatível em todas as localidades onde é um único personagem).
Existe também um operador \w
regexp no regexp perl e no PCRE. PCRE / perl não são expressões regulares POSIX, são apenas outra coisa.
Agora, com a forma como o GNU grep -P
usa o PCRE, ele tem o mesmo problema de sem -P
. Ele pode ser trabalhado por lá usando (*UCP)
(embora isso também tenha efeitos colaterais em locais não UTF8).
O GNU sed
também usa os regexs do GNU libc para seus próprios regexps. Ele o utiliza de tal forma que não tem o mesmo erro que o GNU grep
.
O GNU sed
não suporta os PCREs. Há alguma evidência no código que foi tentada antes, mas não parece mais estar na agenda.
Se você quiser as expressões regulares do Perl, use apenas perl
.
Caso contrário, diria que, em vez de confiar em um recurso não padrão falso de sua implementação específica de sed
/ grep
, seria melhor manter o padrão e usar [_[:alnum:]]
.