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.

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

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

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


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.