
Necesito formatear números de teléfono en un archivo de texto. Aparecen como (ejemplo)8014516912
¿Cómo lo formatearía para poder insertar un -
después de los primeros 3 números y luego otro -
después de otros 3 números, para que aparezca como801-451-6912
¿Cómo haría esto para todas las líneas que contienen un número de teléfono? Tenga en cuenta que los números de teléfono están entre texto, por lo que los números no siempre están en el mismo índice. Por ejemplo puede ser como:
atewfnwieug 8204919561
adw 8915617141
Respuesta1
Necesitas cuantificadores numéricos para esto:
sed -r 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/\1-\2-\3/' your_file
Sin embargo, el -r
conmutador, que permite expresiones regulares extendidas, no es POSIX, por lo que una solución más portátil sería
perl -pe 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/$1-$2-$3/' your_file
En expresiones regulares extendidas, los {n,m}
medios cuantificadores coinciden con el átomo anterior al menos n
y en la mayoría m
de las veces. Por ejemplo, el cuantificador ?
se puede expresar como {0,1}
. Omitir m
significa que no hay límite superior: +
se puede escribir como {1,}
. Finalmente, {n}
significa hacer coincidir el átomo anterior exactamente n
veces.
Si desea utilizar sed
, no necesita exactamente tener expresiones regulares extendidas para esto; es sólo que la forma básica de expresiones regulares sería menos legible:
sed 's/\b\([0-9]\{3\}\)\([0-9]\{3\}\)\([0-9]\{4\}\)\b/\1-\2-\3/' your_file
Respuesta2
Yo usaría perl para esto en su lugar:
$ perl -pe 's/\b(\d{3})(\d{3})(\d{4})\b/$1-$2-$3/' foo.txt
atewfnwieug 820-491-9561
adw 891-561-7141
También puedes hacerlo en el lugar, sed
como:
$ perl -i.bak -pe 's/\b(\d{3})(\d{3})(\d{4})/$1-$2-$3\b/' foo.txt
Si sus números de teléfono pueden estar junto a letras como esta:
abcd1234567890abc
abcd1234567890
1234567890abc
puedes usar este en su lugar:
$ 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 estas opciones suponen que los números de teléfono siempre tienen 10 dígitos, como en su ejemplo.