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.