grep: eliminar texto después del token delimitador

12

Tengo un archivo en el que necesito eliminar todo después del primero ;en cada línea.

Entonces un archivo como este:

sdfsdsdf;
fsdfsddf;sdfsd;

Resultará en esto:

sdfsdsdf
fsdfsddf

He investigado grepy sed. Agradecería una respuesta que incorpore cualquiera de estos comandos.

recolector de basura
fuente

Respuestas:

5

sed es probablemente más fácil y rápido que awk o perl en esta circunstancia:

sed 's/^\([^;][^;]*\);.*$/\1/' some_file_name
Bruce Ediger
fuente
66
¡Esto es más complicado de lo que debería ser! sed 's/;.*//'
Gilles 'SO- deja de ser malvado'
Siento disentir. perl -pe 's /;.*//' some_file_name es igual de fácil y posiblemente hasta un 1500% más rápido cuando se opera en archivos grandes.
código de cabeza
Tengo varios sistemas donde sed está disponible pero Perl no lo está, por lo que animo a usar soluciones más livianas donde sean suficientes.
dubiousjim
7

otra opción es usar el cutcomando

cat a.file | cut -d';' -f1
Richm
fuente
99
us inútil de cat
3

Normalmente uso awkpara cosas como esta:

cat a.file | awk -F=";" '{ print $1 }'

Eso tomará cada línea de un archivo e imprimirá el primer grupo antes del delimitador -F

Marco Ceppi
fuente
77
uso inútil de cat.
Pausado hasta nuevo aviso.
1
Segundo Dennis allí. Y bajo Linux y BSD que -F = ";" No funciona según lo previsto. Y es posible que también desee citar esos $ 1: awk -F ";" '{print $ 1}' a.file
codehead
2

Aquí hay una manera de hacerlo usando GNU grep:

grep -Po "^[^;]+(?=;?)" filename
Pausado hasta nuevo aviso.
fuente
Sin Gnu grep: grep -Eo '^[^;]+;' filenamecasi lo consigue, solo imprime un personaje demasiados. grep -Eo '^[^;]+' filenamecasi también lo consigue, pero también imprimirá líneas completas (no vacías) que no tienen ninguna ;.
dubiousjim