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.

Réponses:


5

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

sed 's/^\([^;][^;]*\);.*$/\1/' some_file_name

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

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


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.