De man 7 regex
:
A bracket expression is a list of characters enclosed in "[]". …
… To include a literal '-', make it the first or last character…. [A]ll other special characters, including '\', lose their special significance within a bracket expression.
Tentar o regexp com o egrep dá um erro:
$ echo "username : username usergroup" | egrep "^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
egrep: Invalid range end
Aqui está uma versão mais simples, que também dá um erro:
$ echo 'hi' | egrep '[\-_]'
egrep: Invalid range end
Como \
não é especial, isso é um intervalo, assim como [a-z]
seria. Você precisa colocar seu -
no final, como [_-]
ou:
echo "username : username usergroup" | egrep "^([a-zA-Z0-9_-]+ : [a-zA-Z0-9_-]+) (usergroup)$"
username : username usergroup
Isso deve funcionar independentemente da sua versão da libc (em egrep ou bash).
edit: Isso também depende de suas configurações de localidade. A manpage adverte sobre isso:
Ranges are very collating-sequence-dependent, and portable programs should avoid relying on them.
Por exemplo:
$ echo '\_' | LC_ALL=en_US.UTF8 egrep '[\-_]'
egrep: Invalid range end
$ echo '\_' | LC_ALL=C egrep '[\-_]'
\_
É claro que, mesmo sem erros, não está fazendo o que você quer:
$ echo '\^_' | LC_ALL=C egrep '^[\-_]+$'
\^_
É um intervalo que, em ASCII, inclui \
, [
, ^
e _
.