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

1

Eu preciso formatar números de telefone em um arquivo de texto. Eles aparecem como (exemplo) 8014516912

Como posso formatá-lo para que eu possa inserir um - após os primeiros 3 números e, em seguida, outro - após outros 3 números, para que ele apareça como 801-451-6912

Como eu faria isso para todas as linhas que contêm um número de telefone? Tenha em mente que os números de telefone estão entre o texto, para que os números não fiquem sempre no mesmo índice. Por exemplo, pode ser como:

atewfnwieug 8204919561
adw 8915617141
    
por John 14.10.2013 / 02:31

2 respostas

2

Você precisa de quantificadores numéricos para isso:

sed -r 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/--/' your_file

A opção -r , 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 times e no máximo m times. Por exemplo, o quantificador ? pode ser expresso como {0,1} . Omitir m significa que não há limite superior: + pode ser gravado como {1,} . Por fim, {n} significa que o átomo anterior corresponde exatamente a n times.

Se você quiser usar sed , você não precisa exatamente ter expressões regulares estendidas para isso; é só que o formulário básico de expressões regulares seria menos legível:

sed 's/\b\([0-9]\{3\}\)\([0-9]\{3\}\)\([0-9]\{4\}\)\b/--/' your_file
    
por 14.10.2013 / 02:34
2

Eu usaria o 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, sed -like:

$ perl -i.bak -pe 's/\b(\d{3})(\d{3})(\d{4})/$1-$2-$3\b/' foo.txt 

Se seus números de telefone podem 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.

    
por 14.10.2013 / 02:36