
Tengo un archivo con nombres de países y luego el prefijo del código de país móvil para ese país como este:
United Kingdom +44 ...more fields
United States Virgin Islands +1 ...more fields
Necesito obtener el nombre del país y el prefijo del móvil. Entonces, la expresión regular se lee como: lea todas las palabras desde el principio de la línea y luego una cadena que comienza con un signo más y un dígito más y luego se detiene.
Intenté algunas cosas con grep, cut e incluso sed pero no puedo conseguirlo.
Respuesta1
prueba con:
grep -o '^[^+]*+[0-9]\+' infile
[^+]*+
coincide con todo hasta que +
se encuentra por primera vez seguido de uno o más dígitos[0-9]\+
Respuesta2
Línea de comando:
$ perl -lne 'print /^(.*?\+\d+)/' input.txt
Esto le proporcionará la información deseada de la entrada.
Laboral:
/^(.*?\+\d+)/
regex extraerá todo hasta la primera aparición de un símbolo más seguido de al menos un símbolo de dígito.- Dado que esto está vinculado a
BOL
través del^
símbolo de intercalación, obviamente solo puede ocurrir una coincidencia. - La coincidencia se pasa a la
print
función. -lne
Las opciones son ejecutarPerl
el código proporcionado en la-e
opción en cada línea del archivo de entrada.-n
hace que Perl no imprima nada a menos que se le solicite específicamente.
Producción:
United Kingdom +44
United States Virgin Islands +1
Respuesta3
Desdetu dices espacioes el delimitador utilizado en su archivo, debería poder utilizar
cut -d ' ' -f 1-5 filename
para extraer las cinco primeras columnas del archivo.
Para los datos dados, esto produce
United Kingdom +44
United States Virgin Islands +1
... pero supongo que esto es sólo por suerte, ya que un país con más de dos palabras en su nombre abarcaría varios campos (no sólo dos).
Un método más sólido sed
para eliminar todo lo que está después del primer conjunto de dígitos en cada línea (es decir, todo lo que está después del código de país):
sed 's/\([[:digit:]][[:digit:]]*\).*/\1/' filename
o,
sed 's/\([[:digit:]]\{1,\}\).*/\1/' filename
o, con -E
y una expresión regular extendida en su lugar,
sed -E 's/([[:digit:]]+).*/\1/' filename