Angenommen, ich habe die Zeichenfolge 1:2:3:4:5
und möchte das letzte Feld ( 5
in diesem Fall) abrufen. Wie mache ich das mit Bash? Ich habe es versucht cut
, aber ich weiß nicht, wie ich das letzte Feld mit angeben soll -f
.
293
5
wenn die Zeichenfolge ist1:2:3:4:5:
(während die Verwendung der Zeichenfolgenoperatoren ein leeres Ergebnis ergibt). Dies ist besonders praktisch, wenn Pfade analysiert werden, die ein Abschlusszeichen enthalten können (oder nicht)/
.${foo%:*}
.#
- von Anfang an;%
- vom Ende.#
,%
- kürzeste Übereinstimmung;##
,%%
- längste Übereinstimmung.echo ${pwd##*/}
funktioniert nicht.pwd
als Variable sieht . Versuchen Sie esdir=$(pwd); echo ${dir##*/}
. Funktioniert bei mir!Eine andere Möglichkeit besteht darin, vorher und nachher umzukehren
cut
:Dies macht es sehr einfach, das vorletzte Feld oder einen beliebigen Bereich von Feldern zu erhalten, die vom Ende an nummeriert sind.
quelle
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
rev
, war genau das, was ich brauchte!cut -b20- | rev | cut -b10- | rev
Es ist schwierig, das letzte Feld mit cut zu erhalten, aber hier sind einige Lösungen in awk und perl
quelle
/
:/a/b/c/d
und/a/b/c/d/
liefertd
bei der Verarbeitung das gleiche Ergebnis ( )pwd | awk -F/ '{print $NF}'
. Die akzeptierte Antwort führt zu einem leeren Ergebnis im Fall von/a/b/c/d/
/
als Trennzeichen verwendet, und wenn Ihr Pfad ist/my/path/dir/
, wird der Wert nach dem letzten Trennzeichen verwendet, bei dem es sich einfach um eine leere Zeichenfolge handelt. Vermeiden Sie daher am besten einen nachgestellten Schrägstrich, wenn Sie so etwas wie ich tun müssen.awk '{$NF=""; print $0}' FS=: OFS=:
funktioniert oft gut genug.Unter der Annahme einer relativ einfachen Verwendung (z. B. kein Entkommen des Trennzeichens) können Sie grep verwenden:
Aufschlüsselung - Suchen Sie alle Zeichen, nicht das Trennzeichen ([^:]) am Ende der Zeile ($). -o druckt nur das passende Teil.
quelle
Einweg:
Ein anderer, der ein Array verwendet:
Noch eine mit einem Array:
Verwenden von regulären Bash-Ausdrücken (Version> = 3.2):
quelle
Übersetzen Sie einfach das Trennzeichen in eine neue Zeile und wählen Sie den letzten Eintrag mit
tail -1
.quelle
\n
, aber in den meisten Fällen ist es die am besten lesbare Lösung.Verwenden von
sed
:quelle
Wenn Ihr letztes Feld ein einzelnes Zeichen ist, können Sie Folgendes tun:
Überprüfen Sie die String-Manipulation in Bash .
quelle
a
, nicht das letzte Feld .Hier gibt es viele gute Antworten, aber ich möchte diese trotzdem mit dem Basisnamen teilen :
Es schlägt jedoch fehl, wenn Ihre Zeichenfolge bereits ein '/' enthält . Wenn Schrägstrich / Ihr Trennzeichen ist, müssen (und sollten) Sie nur den Basisnamen verwenden.
Es ist nicht die beste Antwort, aber es zeigt nur, wie Sie mit Bash-Befehlen kreativ sein können.
quelle
Verwenden von Bash.
quelle
echo ${!#}
anstelle von verwendet habeneval echo \$${#}
.Verwenden Sie zuerst xargs und teilen Sie es mit ":". - n1 bedeutet, dass jede Zeile nur einen Teil hat. Dann drücken Sie den letzten Teil.
quelle
quelle
Für diejenigen, die mit Python vertraut sind, ist https://github.com/Russell91/pythonpy eine gute Wahl, um dieses Problem zu lösen.
Aus der Pythonpy-Hilfe :
-x treat each row of stdin as x
.Mit diesem Tool ist es einfach, Python-Code zu schreiben, der auf die Eingabe angewendet wird.
quelle
Die Antwort könnte etwas spät sein, obwohl eine einfache Lösung darin besteht, die Reihenfolge der Eingabezeichenfolge umzukehren. Auf diese Weise können Sie unabhängig von der Länge immer den letzten Gegenstand erhalten.
Es ist jedoch wichtig zu beachten, dass Sie bei Verwendung dieser Methode und wenn die Zahlen größer als eine Ziffer sind (oder unter allen Umständen größer als ein Zeichen), einen weiteren 'rev'-Befehl über die Pipe-Ausgabe ausführen müssen.
Hoffe ich kann helfen, Prost
quelle
Eine Lösung mit dem eingebauten Read:
Oder um es allgemeiner zu machen:
quelle
Wenn Sie Python mögen und die Option haben, ein Paket zu installieren, können Sie dieses Python-Dienstprogramm verwenden .
quelle
echo "1:2:3:4:5" | python -c "import sys; print(list(sys.stdin)[0].split(':')[-1])"
pythonp
Pakets besteht darin, Sie dazu zu bringen, die gleichen Dinge wiepython -c
mit weniger Zeichentypen zu tun. Bitte werfen Sie einen Blick auf die README im Repository.Regex Matching in
sed
ist gierig (geht immer bis zum letzten Vorkommen), was Sie hier zu Ihrem Vorteil nutzen können:quelle