Antworten:
Sie können Zeichenfolgenoperatoren verwenden :
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
Dies schneidet alles von vorne bis zu einem ':' gierig ab.
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
${foo%:*}
. #
- von Anfang an; %
- vom Ende. #
, %
- kürzeste Übereinstimmung; ##
, %%
- längste Übereinstimmung.
echo ${pwd##*/}
funktioniert nicht.
pwd
als Variable sieht . Versuchen Sie es dir=$(pwd); echo ${dir##*/}
. Funktioniert bei mir!
Eine andere Möglichkeit besteht darin, vorher und nachher umzukehren cut
:
$ echo ab:cd:ef | rev | cut -d: -f1 | rev
ef
Dies macht es sehr einfach, das vorletzte Feld oder einen beliebigen Bereich von Feldern zu erhalten, die vom Ende an nummeriert sind.
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
echo 1:2:3:4:5 | awk -F: '{print $NF}'
echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]'
/
: /a/b/c/d
und /a/b/c/d/
liefert d
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:
$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5
Aufschlüsselung - Suchen Sie alle Zeichen, nicht das Trennzeichen ([^:]) am Ende der Zeile ($). -o druckt nur das passende Teil.
Einweg:
var1="1:2:3:4:5"
var2=${var1##*:}
Ein anderer, der ein Array verwendet:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
var2=${var2[@]: -1}
Noch eine mit einem Array:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
count=${#var2[@]}
var2=${var2[$count-1]}
Verwenden von regulären Bash-Ausdrücken (Version> = 3.2):
var1="1:2:3:4:5"
[[ $var1 =~ :([^:]*)$ ]]
var2=${BASH_REMATCH[1]}
$ echo "a b c d e" | tr ' ' '\n' | tail -1
e
Übersetzen Sie einfach das Trennzeichen in eine neue Zeile und wählen Sie den letzten Eintrag mit tail -1
.
\n
, aber in den meisten Fällen ist es die am besten lesbare Lösung.
Verwenden von sed
:
$ echo '1:2:3:4:5' | sed 's/.*://' # => 5
$ echo '' | sed 's/.*://' # => (empty)
$ echo ':' | sed 's/.*://' # => (empty)
$ echo ':b' | sed 's/.*://' # => b
$ echo '::c' | sed 's/.*://' # => c
$ echo 'a' | sed 's/.*://' # => a
$ echo 'a:' | sed 's/.*://' # => (empty)
$ echo 'a:b' | sed 's/.*://' # => b
$ echo 'a::c' | sed 's/.*://' # => c
Wenn Ihr letztes Feld ein einzelnes Zeichen ist, können Sie Folgendes tun:
a="1:2:3:4:5"
echo ${a: -1}
echo ${a:(-1)}
Überprüfen Sie die String-Manipulation in Bash .
a
, nicht das letzte Feld .
Hier gibt es viele gute Antworten, aber ich möchte diese trotzdem mit dem Basisnamen teilen :
basename $(echo "a:b:c:d:e" | tr ':' '/')
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.
Verwenden von Bash.
$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo \$${#}
0
echo ${!#}
anstelle von verwendet haben eval echo \$${#}
.
for x in `echo $str | tr ";" "\n"`; do echo $x; done
Für diejenigen, die mit Python vertraut sind, ist https://github.com/Russell91/pythonpy eine gute Wahl, um dieses Problem zu lösen.
$ echo "a:b:c:d:e" | py -x 'x.split(":")[-1]'
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.
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.
[chris@desktop bin]$ echo 1:2:3:4:5 | rev | cut -d: -f1
5
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.
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1
42
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1 | rev
24
Hoffe ich kann helfen, Prost
Wenn Sie Python mögen und die Option haben, ein Paket zu installieren, können Sie dieses Python-Dienstprogramm verwenden .
# install pythonp
pythonp -m pip install pythonp
echo "1:2:3:4:5" | pythonp "l.split(':')[-1]"
5
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 wie python -c
mit weniger Zeichentypen zu tun. Bitte werfen Sie einen Blick auf die README im Repository.
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)/
.