Extrahieren Sie den Basisdateinamen mit bash aus einer URL

13
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?

ManuelSchneid3r
quelle
Okay, ich erwarte, dass die falschen Dinge passieren. Nun, ich möchte file.ext extrahieren
ManuelSchneid3r
Sie versuchen, das Ende der Schnur abzuschneiden? Versuchen Sie es dirname $url. Oder grep -o 'http://[^/]*' <<<$url.
Kevin

Antworten:

26

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.

ManuelSchneid3r
quelle
Hah, das merken wir beide gleichzeitig. Ich bin froh, Ihnen helfen zu können.
Derobert
10

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 hnicht 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.

derobert
quelle
Ich bin froh, dass Sie erklärt haben, was zu tun ist, und das Zitat aus der Manpage ist ein riesiges Plus! Das hat mir sehr geholfen! Danke noch einmal! :)
Fadi
5

basename(1) funktioniert auch mit URLs, Sie können also einfach Folgendes tun:

url=http://www.foo.bar/file.ext; basename $url
Frank Zdarsky
quelle
4

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

Peter.O
quelle