Wie bekomme ich den letzten Teil des http-Links in Bash?


25

Ich habe einen http-Link:

http://www.test.com/abc/def/efg/file.jar 

und ich möchte den letzten Teil file.jar als Variable speichern, daher lautet die Ausgabezeichenfolge "file.jar".

Bedingung : Linkdose hat unterschiedliche Länge zB:

http://www.test.com/abc/def/file.jar.

Ich habe es so versucht:

awk -F'/' '{print $7}'

, aber das Problem ist die Länge der URL, also brauche ich einen Befehl, der für jede URL-Länge verwendet werden kann.

Antworten:


50

Mit awkfür diese funktionieren würde, aber es ist eine Art von Hirschjagd mit einer Haubitze. Wenn Ihre URL bereits leer ist, ist es ziemlich einfach, das zu tun, was Sie wollen, wenn Sie sie in eine Shell-Variable einfügen und die basheingebaute Parameterersetzung verwenden:

$ myurl='http://www.example.com/long/path/to/example/file.ext'
$ echo ${myurl##*/}
file.ext

Das funktioniert, indem ein Präfix entfernt wird, das gierig mit '* /' übereinstimmt. Dies macht der ##Operator folgendermaßen:

${haystack##needle} # removes any matching 'needle' from the
                    # beginning of the variable 'haystack'

Irgendeine Erklärung dafür?
Questionmark

Sicher. Wird das gehen?
DopeGhoti

Das ist großartig :)
Questionmark

2
Wenn Sie Abfragezeichenfolgen entfernen möchten, können Sie zuerst eine Zwischenvariable zuweisen, z. B. file=${myurl##*/}dann eine gierige umgekehrte Zuordnung verwenden, um eine Sicherungskopie der zu erstellen ?(vergessen Sie nicht, diese zu maskieren!), echo ${file%%\?*}
Z.

21

basenameund auch dirnamefür URLs gut geeignet:

> url="http://www.test.com/abc/def/efg/file.jar"
> basename "$url"; basename -s .jar "$url"; dirname "$url"
file.jar
file
http://www.test.com/abc/def/efg

+1 Genial, es funktioniert, weil eine URL und ein Pfad und beide URIs.
Tulains Córdova

1
@ TulainsCórdova Ein Pfad ist kein URI . Dies funktioniert, weil basenameund dirnameSplit-Strings auf /, und das funktioniert auch mit URLs, zumindest solange sie keinen lokalen Teil haben (aber nicht mit URIs im Allgemeinen).
Stephen Kitt

In dem Wikipedia - Artikel über URIs, geben sie die folgende als gültige Beispiele für URI - Referenzen: /relative/URI/with/absolute/path/to/resource.txt, relative/path/to/resource.txt, ../../../resource.txtund resource.txt en.wikipedia.org/wiki/...
Tulains Córdova

1
@ TulainsCórdova Wikipedia ist nicht falsch, /relative/pathkann entweder ein Dateisystempfad oder ein relativer URI sein. Aber welche davon es ist, hängt vom Kontext ab. Wenn es als Dateisystempfad verwendet wird, ist es kein URI. Wenn es als URI verwendet wird, ist es kein Dateisystempfad. Zu sagen, dass es sich um eine URI handelt, nur weil sie der Syntax entspricht, ist, als würde man sagen, dass jedes der Wörter in diesem Kommentar auch eine URI ist.
HDV

11

Mit awkkönnen Sie $NF, unabhängig von der Anzahl der Felder, das letzte Feld abrufen:

awk -F / '{print $NF}'

Wenn Sie diese Zeichenfolge in einer Shell-Variablen speichern, können Sie Folgendes verwenden:

a=http://www.test.com/abc/def/efg/file.jar
printf '%s\n' "${a##*/}"

6

Die meisten der veröffentlichten Antworten sind in URLs, die Abfragezeichenfolgen oder -ziele enthalten, wie z. B. die folgenden, nicht zuverlässig:

https://example.com/this/is/a/path?query#target

In Python ist die URL-Analyse in der Standardbibliothek enthalten. es ist einfacher, es machen zu lassen. Z.B,

from urllib import parse
import sys
path = parse.urlparse(sys.stdin.read().strip()).path
print("/" if not path or path == "/" else path.rsplit("/", 1)[-1])

Sie können dies zu einer einzigen python3 -ckomprimieren, die in einem Shell-Skript verwendet wird:

echo 'https://example.com/this/is/a/path/componets?query#target' \
    | python3 -c 'from urllib import parse; import sys; path = parse.urlparse(sys.stdin.read().strip()).path; print("/" if not path or path == "/" else path.rsplit("/", 1)[-1])'

(Sie können das Skript auch zur besseren Lesbarkeit 'ausgeblendet lassen. Dadurch können Sie Zeilenumbrüche einfügen.)

Natürlich ist Ihr Shell-Skript jetzt von Python abhängig.

(Ich bin mir ein wenig unsicher, ob dies versucht, Fälle zu behandeln, in denen die Pfadkomponente der URL der Root ist. /) Passen Sie an, und testen Sie, ob dies für Sie von Bedeutung ist.)


1

Eine Methode ist, revdie URL dann das Feld auszuschneiden und dann reverneut. z.B:

echo 'http://www.test.com/abc/def/efg/file.jar ' | rev | cut -d '/' -f 1 | rev

Ausgabe:

file.jar 

Beispiel 2:

echo 'http://www.test.com/abc/cscsc/sccsc/def/efg/file.jar ' | rev | cut -d '/' -f 1 | rev

Ausgabe:

file.jar
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.