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.

Antworten:


5

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

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

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

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


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.