¿Cómo usaría sed para detectar una cierta cantidad de números antes de insertar un carácter? ###-###-####

¿Cómo usaría sed para detectar una cierta cantidad de números antes de insertar un carácter? ###-###-####

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 -rconmutador, 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 ny en la mayoría mde las veces. Por ejemplo, el cuantificador ?se puede expresar como {0,1}. Omitir msignifica que no hay límite superior: +se puede escribir como {1,}. Finalmente, {n}significa hacer coincidir el átomo anterior exactamente nveces.

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, sedcomo:

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

información relacionada