Come ottenere l'ultima parte del collegamento http in Bash?


25

Ho un collegamento http:

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

e voglio salvare l'ultima parte file.jar in variabile, quindi la stringa di output è "file.jar".

Condizione : il link può avere una lunghezza diversa, ad es .:

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

L'ho provato in questo modo:

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

, ma il problema è la lunghezza dell'URL, quindi ho bisogno di un comando che può essere utilizzato per qualsiasi lunghezza dell'URL.

Risposte:


51

Usarlo awkper questo avrebbe funzionato, ma è una specie di caccia al cervo con un obice. Se hai già l'URL nudo, è abbastanza semplice fare quello che vuoi se lo metti in una variabile di shell e usi la bashsostituzione dei parametri incorporata:

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

Il modo in cui funziona è rimuovendo un prefisso che corrisponde avidamente '* /', che è ciò che l' ##operatore fa:

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

Qualche spiegazione da seguire?
Punto interrogativo

Sicuro. Lo farà?
DopeGhoti,

È fantastico :)
Questionmark

2
Se si desidera eliminare le stringhe di query, è possibile innanzitutto assegnare a una variabile intermedia file=${myurl##*/}, ad esempio , quindi utilizzare l'avida corrispondenza inversa per eseguire il backup su ?(non dimenticare di scappare!), Ad esempioecho ${file%%\?*}
Doktor J

21

basenamee dirnamefunziona bene anche per gli URL:

> 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 brillante, funziona perché un URL e un PERCORSO ed entrambi gli URI.
Tulains Córdova,

1
@ TulainsCórdova un percorso non è un URI ; questo funziona perché basenamee dirnamedividere le stringhe su /, e questo funziona anche con gli URL, almeno fintanto che non hanno una porzione locale (non con URI in generale però).
Stephen Kitt,

Nel articolo di Wikipedia sugli URI, danno il seguente come esempi validi di riferimenti URI: /relative/URI/with/absolute/path/to/resource.txt, relative/path/to/resource.txt, ../../../resource.txte resource.txt en.wikipedia.org/wiki/...
Tulains Córdova

1
@ TulainsCórdova Wikipedia non è sbagliata, /relative/pathpuò essere un percorso del file system o un URI relativo. Ma quale di questi dipende dal contesto. Quando viene utilizzato come percorso del file system, non è un URI. Quando viene utilizzato come URI, non è un percorso del file system. Dire che è un URI solo perché coincide con la sintassi è come dire che ognuna delle parole di questo commento è anche un URI.
hvd,

11

Con awk, è possibile utilizzare $NF, per ottenere l'ultimo campo, indipendentemente dal numero di campi:

awk -F / '{print $NF}'

Se memorizzi quella stringa nella variabile shell, puoi usare:

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

6

La maggior parte delle risposte pubblicate non è affidabile per gli URL che contengono stringhe di query o destinazioni, come ad esempio i seguenti:

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

Python ha l'analisi dell'URL nella sua libreria standard; è più facile lasciarlo fare. Per esempio,

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])

Puoi compattarlo in un singolo python3 -cper usarlo in uno script di shell:

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])'

(Puoi anche mantenere lo script diviso, anche per leggibilità. 'Ti permetterà di inserire nuove righe.)

Certo, ora il tuo script di shell ha una dipendenza da Python.

(Non sono sicuro del caso in cui si tenta di gestire i casi in cui il componente del percorso dell'URL è il root ( /); regolare / test se questo è importante per te.)


1

Un metodo è revl'URL, quindi tagliare il campo e poi di revnuovo. per esempio:

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

Produzione:

file.jar 

Esempio 2:

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

Produzione:

file.jar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.