Na regex básica padrão, (?\(\d(3}\)[-.]?
significa:
a literal left parenthesis
a literal question mark
(start of a group)
a literal character 'd'
a literal left parenthesis
the number '3'
a literal closing brace
(end of group)
a dash or a dot
a question mark
, isto é, imprimirá x
:
echo '(?d(3}-?' |sed 's/(?\(\d(3}\)[-.]?/x/'
É muito provável que você queira que sed -E
ative as expressões regulares estendidas (ERE) e, em seguida, use (
e )
para agrupamento e \(
e \)
para parênteses literais.
Observe também que \d
é parte de regexes Perl, não de padrão, e enquanto o GNU sed suporta alguns \X
escapes, eles não são padrão (e eu não acho que ele suporta \d
). Mesmo para \?
, o GNU sed suporta no BRE para significar o que ?
significa em ERE, mas não é padrão.
Com tudo isso em mente:
$ echo '(123)-456-7890' | sed -E 's/\(?([0-9]{3})\)?[-.]?([0-9]{3})[-.]?([0-9]{4})//'
1234567890
Embora você possa quase apenas forçar a força bruta e remover tudo, menos os dígitos:
$ echo '(123)-456-7890' | sed -e 's/[^0-9]//g'
1234567890
(isso também aceitaria coisas como (123)-4.5-6-7a8b9c0
...)
Veja também: