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?


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.


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.