url=http://www.foo.bar/file.ext; echo ${url##/*}
Ich habe erwartet, dass dieser Code gedruckt wird file.ext
, aber er druckt die gesamte URL. Warum? Wie kann ich den Dateinamen extrahieren?
dirname $url
. Oder grep -o 'http://[^/]*' <<<$url
.
url=http://www.foo.bar/file.ext; echo ${url##/*}
Ich habe erwartet, dass dieser Code gedruckt wird file.ext
, aber er druckt die gesamte URL. Warum? Wie kann ich den Dateinamen extrahieren?
dirname $url
. Oder grep -o 'http://[^/]*' <<<$url
.
Antworten:
Weil das Wort mit der zu schneidenden Zeichenfolge übereinstimmen muss. Es sollte so aussehen:
url="http://www.foo.bar/file.ext"; echo "${url##*/}"
Danke derobert, du hast mich in die richtige Richtung gelenkt.
So zitieren Sie die Manpage:
${parameter##word}
Remove matching prefix pattern. The word is expanded to produce
a pattern just as in pathname expansion. If the pattern matches
the beginning of the value of parameter, […]
/*
stimmt nicht mit dem Anfang überein, da Ihre URL mit h
nicht beginnt /
.
Eine einfache Möglichkeit, das zu tun, wonach Sie suchen (laut Ihrem Kommentar), ist echo "$url" | rev | cut -d / -f 1 | rev
. Aber das wird natürlich interessante Ergebnisse für URLs liefern, die mit einem Schrägstrich enden.
Eine andere Möglichkeit, das zu tun, was Sie möchten, besteht möglicherweise darin, */
stattdessen das Muster zu verwenden.
basename
(1) funktioniert auch mit URLs, Sie können also einfach Folgendes tun:
url=http://www.foo.bar/file.ext; basename $url
Siehe auch: Bash Extended Globbing , obwohl in diesem Fall der Extended Glob nicht unbedingt erforderlich ist.
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
Ausgabe: file.ext