Como eu usaria o sed para detectar uma certa quantidade de números antes de inserir um caractere? ###-###-####

Como eu usaria o sed para detectar uma certa quantidade de números antes de inserir um caractere? ###-###-####

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 -ropçã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 ne na maioria mdas vezes. Por exemplo, o quantificador ?pode ser expresso como {0,1}. Omitir msignifica 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, sedcomo:

$ 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.

informação relacionada