Preciso formatar números de telefone em um arquivo de texto. Eles aparecem como (exemplo)8014516912
Como eu iria formatá-lo para poder inserir um -
após os 3 primeiros números e outro -
após outros 3 números, para que aparecesse como801-451-6912
Como eu faria isso para todas as linhas que contêm um número de telefone? Lembre-se de que os números de telefone estão entre textos, portanto nem sempre estão no mesmo índice. Por exemplo, pode ser assim:
atewfnwieug 8204919561
adw 8915617141
Responder1
Você precisa de quantificadores numéricos para isso:
sed -r 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/\1-\2-\3/' your_file
A -r
opção, que permite expressões regulares estendidas, não é POSIX, portanto, uma solução mais portátil seria
perl -pe 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/$1-$2-$3/' your_file
Em expressões regulares estendidas, o quantificador {n,m}
significa corresponder ao átomo anterior pelo menos n
e na maioria m
das vezes. Por exemplo, o quantificador ?
pode ser expresso como {0,1}
. Omitir m
significa que não há limite superior: +
pode ser escrito como {1,}
. Finalmente, {n}
significa corresponder exatamente ao átomo anterior n
.
Se você quiser usar sed
, não precisa exatamente ter expressões regulares estendidas para isso; só que o formato básico das expressões regulares seria menos legível:
sed 's/\b\([0-9]\{3\}\)\([0-9]\{3\}\)\([0-9]\{4\}\)\b/\1-\2-\3/' your_file
Responder2
Eu usaria perl para isso:
$ perl -pe 's/\b(\d{3})(\d{3})(\d{4})\b/$1-$2-$3/' foo.txt
atewfnwieug 820-491-9561
adw 891-561-7141
Você também pode fazer isso no local, sed
como:
$ perl -i.bak -pe 's/\b(\d{3})(\d{3})(\d{4})/$1-$2-$3\b/' foo.txt
Se seus números de telefone puderem ser adjacentes a letras como esta:
abcd1234567890abc
abcd1234567890
1234567890abc
você pode usar este em vez disso:
$ perl -pe 's/([^\d]*)(\d{3})(\d{3})(\d{4})([^\d]*)/$1$2-$3-$4$5/' foo.txt
abcd123-456-7890abc
abcd123-456-7890
123-456-7890abc
Todas essas opções pressupõem que os números de telefone tenham sempre 10 dígitos, como no seu exemplo.