Recebo periodicamente um arquivo de texto com números de telefone formatados de maneiras totalmente diferentes: ##########
, ###-###-####
, (###) ###-###
, etc. Normalmente, há dez dígitos, mas já vi +1 (###) ###-####
.
Eventualmente, o arquivo é importado para um banco de dados, mas por motivos que não vou abordar, seria útil ter os números de telefone em um formato padrão, (###) ###-####
.
A única constante é que os números de telefone sempre ficam entre o segundo e o terceiro caractere de tabulação em cada linha.
Existe uma maneira de fazer isso a partir da linha de comando?
Você pode construir uma expressão regular que corresponda a qualquer um dos formatos e capture os dígitos e os substitua novamente no formato desejado.
Por exemplo, para corresponder e capturar uma sequência de três dígitos decimais opcionalmente entre parênteses com uma Expressão Regular Estendida (ERE), você pode escrever
\(?([0-9]{3})\)?
enquanto[- ]?
corresponde a um hífen ou espaço opcional. Construindo desta formacorresponderá a 3 dígitos opcionalmente entre parênteses, opcionalmente seguidos por um hífen ou espaço, depois mais dígitos opcionalmente seguidos por um hífen ou espaço, seguidos por 4 dígitos.
Aplicando a expressão em uma
sed
substituição:Isso deve cobrir você, desde que o arquivo seja como você descreveu. O comando preserva as informações antes e depois do número de telefone e as formata da maneira que você solicitou. Se a saída parecer boa, adicione a
-i
opção parased
editá-la no local ou forneça o redirecionamento de saída usando> output_file
no final.Eu testei em um arquivo contendo este texto:
A saída foi:
Você precisa igualar o campo e reformatá-lo; aqui está um script awk que procura por três variações e as reformata (antes da impressão padrão da linha reconstituída):
Salve isso em um arquivo, talvez
phone.awk
, e chame-o com:awk -F $'\t' -f phone.awk < input
.