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?Dies ist die einzige mögliche Lösung, um nichts als cut zu verwenden:
echo "s.t.r.i.n.g." | cut -d'.' -f2- [wiederholen_der_folgenden_teil_fuerimmer_oder_bis_der_speicher_ausgeht:] | cut -d'.' -f2-
Mit dieser Lösung kann die Anzahl der Felder tatsächlich unbekannt sein und sich von Zeit zu Zeit ändern. Da die Zeilenlänge jedoch LINE_MAX-Zeichen oder Felder, einschließlich des Zeilenumbruchszeichens, nicht überschreiten darf, kann eine beliebige Anzahl von Feldern als echte Bedingung dieser Lösung niemals Teil sein.
Ja, eine sehr alberne Lösung, aber die einzige, die meiner Meinung nach den Kriterien entspricht.
Es ist besser, awk
beim Arbeiten mit tabellarischen Daten zu verwenden. Wenn es mit awk
erreicht werden kann, warum nicht das nutzen? Ich schlage vor, dass du nicht deine kostbare Zeit verschwendest und stattdessen eine Handvoll Befehle benutzt, um die Arbeit zu erledigen.
Beispiel:
# $NF bezieht sich auf die letzte Spalte in awk
ll | awk '{print $NF}'
Wenn Ihr Eingabestring keine Schrägstriche enthält, können Sie basename
und ein Subshell verwenden:
$ basename "$(echo 'maps.google.com' | tr '.' '/')"
Dies verwendet weder sed
noch awk
, verwendet jedoch auch nicht cut
, daher bin ich mir nicht sicher, ob es als Antwort auf die Frage gilt, wie sie gestellt ist.
Dies funktioniert nicht gut, wenn Eingabestrings verarbeitet werden, die Schrägstriche enthalten können. Ein Workaround für diese Situation wäre, den Schrägstrich durch ein anderes Zeichen zu ersetzen, von dem Sie wissen, dass es nicht Bestandteil eines gültigen Eingabestrings ist. Zum Beispiel ist das Pipe-Zeichen (|
) auch nicht in Dateinamen erlaubt, also würde dies funktionieren:
$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'
Das folgende implementiert den Vorschlag eines Freundes
#!/bin/bash
rcut(){
nu="$( echo $1 | cut -d"$DELIM" -f 2- )"
if [ "$nu" != "$1" ]
then
rcut "$nu"
else
echo "$nu"
fi
}
$ export DELIM=.
$ rcut a.b.c.d
d