grep - Entfernen von Text nach dem Trennzeichen

12

Ich habe eine Datei, in der ich in ;jeder Zeile nach dem ersten alles beseitigen muss.

Also eine Datei wie diese:

sdfsdsdf;
fsdfsddf;sdfsd;

Wird dazu führen, dass:

sdfsdsdf
fsdfsddf

Ich habe in grepund geschaut sed. Ich würde eine Antwort begrüßen, die einen dieser Befehle enthält.

Müllabfuhr
quelle

Antworten:

5

sed ist unter diesen Umständen wahrscheinlich am einfachsten und schneller als awk oder perl:

sed 's/^\([^;][^;]*\);.*$/\1/' some_file_name
Bruce Ediger
quelle
6
Das ist komplizierter als es sein sollte! sed 's/;.*//'
Gilles 'SO- hör auf böse zu sein'
Ich bin anderer Ansicht. /;.*// 'some_file_name von perl -pe ist genauso einfach und vermutlich bis zu 1500% schneller, wenn Sie mit großen Dateien arbeiten.
Codehead
Ich habe mehrere Systeme, auf denen sed verfügbar ist, Perl jedoch nicht. Daher empfehle ich, leichtere Lösungen zu verwenden, wenn diese ausreichen.
dubiousjim
7

Eine andere Option ist die Verwendung des cutBefehls

cat a.file | cut -d';' -f1
Richm
quelle
9
nutzlos uns von cat
3

Ich benutze normalerweise awkfür solche Dinge:

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

Das wird jede Zeile einer Datei nehmen und die erste Gruppe vor dem Begrenzer drucken -F

Marco Ceppi
quelle
7
nutzlose Verwendung von cat.
Bis auf weiteres angehalten.
1
Zweiter Dennis da. Und unter Linux und BSD ist -F = ";" funktioniert nicht wie vorgesehen. Und vielleicht möchten Sie auch dieses $ 1 zitieren: awk -F ";" '{print $ 1}' a.file
Codehead
2

Hier ist eine Möglichkeit, dies mit GNU zu tun grep:

grep -Po "^[^;]+(?=;?)" filename
Bis auf weiteres angehalten.
quelle
Ohne Gnu grep: grep -Eo '^[^;]+;' filenamewird es fast geschafft, es wird nur ein Zeichen zuviel gedruckt. grep -Eo '^[^;]+' filenamefast wird es auch, aber es wird auch komplette (nicht leere) Zeilen drucken, die keine haben ;.
dubiousjim