grep - suppression de texte après le jeton délimiteur

12

J'ai un fichier dans lequel je dois tout supprimer après le premier ;sur chaque ligne.

Donc, un fichier comme celui-ci:

sdfsdsdf;
fsdfsddf;sdfsd;

Se traduira par ceci:

sdfsdsdf
fsdfsddf

J'ai examiné grepet sed. J'apprécierais une réponse incorporant l'une ou l'autre de ces commandes.

Éboueur
la source

Réponses:

5

sed est probablement plus facile et plus rapide que awk ou perl dans ce cas:

sed 's/^\([^;][^;]*\);.*$/\1/' some_file_name
Bruce Ediger
la source
6
C'est plus compliqué que ça ne devrait l'être! sed 's/;.*//'
Gilles 'SO- arrête d'être méchant'
Je ne suis pas d'accord. perl -pe 's /;.*//' some_file_name est tout aussi simple, et sans doute jusqu'à 1500% plus rapide lors de l'utilisation dans des fichiers volumineux.
codehead
J'ai plusieurs systèmes où sed est disponible mais perl ne l'est pas, donc j'encourage l'utilisation de solutions plus légères là où elles suffisent.
dubiousjim
7

une autre option consiste à utiliser la cutcommande

cat a.file | cut -d';' -f1
Richm
la source
9
nous inutile de chat
3

J'utilise généralement awkpour des choses comme ça:

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

Cela prendra chaque ligne d'un fichier et imprimera le premier groupe avant le délimiteur -F

Marco Ceppi
la source
7
utilisation inutile de cat.
pause jusqu'à nouvel ordre.
1
Deuxième Dennis là-bas. Et sous Linux et BSD que -F = ";" ne fonctionne pas comme prévu. Et vous voudrez peut-être aussi citer ce $ 1: awk -F ";" '{print $ 1}' a.file
codehead
2

Voici un moyen de le faire en utilisant GNU grep:

grep -Po "^[^;]+(?=;?)" filename
En pause jusqu'à nouvel ordre.
la source
Sans grep Gnu: grep -Eo '^[^;]+;' filenamepresque, il imprime juste un caractère de trop. grep -Eo '^[^;]+' filenamepresque, mais il imprimera également des lignes complètes (non vides) qui n'en ont pas ;.
dubiousjim