Ohne Verwendung von sed
oder awk
, nur cut
, wie bekomme ich das letzte Feld, wenn die Anzahl der Felder unbekannt oder bei jeder Zeile variiert?
Antworten
Zu viele Anzeigen?Sie könnten etwas Ähnliches versuchen:
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
Erklärung
rev
kehrt "maps.google.com" um und wird zumoc.elgoog.spam
cut
verwendet Punkt (d.h. '.') als Trennzeichen und wählt das erste Feld aus, dasmoc
ist- schließlich kehren wir es wieder um, um
com
zu erhalten
Charles Duffy
Punkte
255246
Verwenden Sie eine Parametererweiterung. Dies ist viel effizienter als jede Art von externem Befehl, cut
(oder grep
) inklusive.
data=foo,bar,baz,qux
last=${data##*,}
Sehen Sie sich BashFAQ #100 für eine Einführung in die native Zeichenkettenmanipulation in Bash an.
tom
Punkte
20831
Es ist nicht möglich, nur cut
zu verwenden. Hier ist eine Möglichkeit, grep
zu verwenden:
grep -o '[^,]*$'
Ersetzen Sie das Komma durch andere Trennzeichen.
Erklärung:
-o
(--only-matching
) gibt nur den Teil der Eingabe aus, der mit dem Muster übereinstimmt (standardmäßig wird die gesamte Zeile ausgegeben, wenn sie übereinstimmt).[^,]
ist eine Zeichenklasse, die jedes Zeichen außer einem Komma übereinstimmt.*
entspricht dem vorherigen Muster null oder mehrfach, also passt[^,]*
null oder mehr Nicht-Komma-Zeichen an.$
entspricht dem Ende des Strings.- Wenn es mehrere mögliche Übereinstimmungen gibt, bevorzugt
grep
die, die am frühesten beginnt. Daher wird das gesamte letzte Feld übereinstimmen.
Vollständiges Beispiel:
Wenn wir eine Datei namens data.csv mit folgendem Inhalt haben
one,two,three
foo,bar
dann wird grep -o '[^,]*$' < data.csv
ausgeben
three
bar
Amir Mehler
Punkte
3494
rjni
Punkte
421
- See previous answers
- Weitere Antworten anzeigen