Regex zum Grep-Füllen, gefolgt von einem signierten Float

Regex zum Grep-Füllen, gefolgt von einem signierten Float

Ich möchte die letzte Spalte aus Zeilen extrahieren, die wie folgt aussehen:

880.952         NAV_Y                uSimMarine      -146.17516

Die Zahl ist nicht immer negativ und hat keine feste Länge (d. h. sie hat nicht immer die gleiche Anzahl von Dezimalstellen).

So komme ich fast ans Ziel:

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

Außer dass es auch mit der Zahl in der ersten Spalte übereinstimmt.

Wenn ich dies ändere, um das Zeilenende einzuschließen und die Übereinstimmungen in der ersten Spalte auszuschließen:

grep -E "[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

Ich bekomme keine Übereinstimmungen, was ich nicht verstehe.

Was übersehe ich hier?

Antwort1

Verankern Sie den Ausdruck am Ende der Zeile:

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

Wenn Sie die PCRE-Option hinzufügen, um -onur die erfasste Gruppe zurückzugeben, werden Sie sehen, dass Ihr Beispiel übereinstimmt und die gewünschte Übereinstimmung zurückgibt:

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$)"

-146.17516

Um Übereinstimmungen mit Zeilen in einer Datei mit optionalen, nachstehenden Leerzeichen zu finden, fügen Sie einfach \s*Folgendes hinzu:

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}\s*$)"

Antwort2

Vor dem ersten regulären Ausdruck muss ein Leerzeichen stehen:

grep -E "\s+-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

sollte funktionieren, da es die Übereinstimmung am Zeilenanfang ausschließt.

Falls Sie es wollenNurdie vierte Spalte, können Sie leicht erreichen, dass entweder mit GNU sed:

sed -r 's/^\S+\s+\S+\s+\S+\s+(\S+)(\s.*|)$/\1/'

wobei \sein beliebiges Leerzeichen (Leerzeichen, Tabulator und die verschiedenen „Feeds“ 1 ) und \Sein Nicht-Leerzeichen ist, oder (auf viel sauberere Weise) mit sed | cut:

sed 's/\s\+/\t/g' | cut -f4

Dadurch werden zunächst alle Leerzeichen in einem Tab komprimiert und dann cutdie vierte Spalte ausgeschnitten. Außerdem können Sie problemlos weitere Spalten auswählen, z. B. mit cut -f1,4und so weiter.

1) Das heißt: Form Feed, Line Feed und Carriage Return, wobei der mittlere in der Regel sedals Zeilentrenner interpretiert wird.

verwandte Informationen