Bash'deki http bağlantısının son bölümünü nasıl alabilirim?


25

Bir http bağlantım var:

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

ve son dizini file.jar değişkenine kaydetmek istiyorum, bu yüzden çıktı dizesi "file.jar" olur.

Durum : bağlantı farklı uzunlukta olabilir örneğin:

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

Bu şekilde denedim:

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

, ancak sorun URL'nin uzunluğudur, bu yüzden herhangi bir URL uzunluğu için kullanılabilecek bir komuta ihtiyacım var.

Yanıtlar:


51

Bunun için kullanmak awkişe yarayacak, ancak bir obüs ile geyik avı. URL'nizi zaten çıplak olarak kullanıyorsanız, bir kabuk değişkenine koyarsanız ve bashyerleşik parametre değişimini kullanırsanız, istediğiniz şeyi yapmak oldukça kolaydır :

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

Bunun işleyiş şekli, ##operatörün yaptığı gibi '* /' ile tam olarak eşleşen bir öneki kaldırmaktır :

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

Bununla ilgili herhangi bir açıklama var mı?
Soru

Emin. Olacak?
DopeGhoti

Bu harika :)
Questionmark

2
Sorgu dizeleri şerit istiyorsanız, bir ara değişken örneğin ilk atama olabilir file=${myurl##*/}, daha sonra yedeklemek açgözlü ters eşlemesi kullanabilir ?(ondan kaçmak için unutmayın!), Örneğinecho ${file%%\?*}
Doktor J

21

basenameve dirnameçok URL'ler için çalışma iyi:

> 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 Harika, çünkü bir URL ve bir PATH ve hem de URI'ler çalışıyor.
Tulains Córdova

1
@ TulainsCórdova bir yol URI değil ; Bu eserler nedeniyle basenameve dirnamebölünmüş dizeleri üzerinde / ve bu yeter ki (değil genel olsa içinde URI'lerinin ile) yerel bir bölümünü yok gibi, en azından çok URL'ler ile işin olur.
Stephen Kitt

: URI'ları ilgili Wikipedia makalesinde, onlar geçerli URI referansına örnek olarak aşağıdakileri vermek /relative/URI/with/absolute/path/to/resource.txt, relative/path/to/resource.txt, ../../../resource.txtve resource.txt en.wikipedia.org/wiki/...
Tulains Cordova

1
@ TulainsCórdova Wikipedia yanlış değil, /relative/pathbir dosya sistemi yolu veya bağıl bir URI olabilir. Ancak bunlardan hangisi içeriğe bağlıdır. Bir dosya sistemi yolu olarak kullanıldığında, bir URI değildir. URI olarak kullanıldığında, bir dosya sistemi yolu değildir. Bunun bir URI olduğunu söylemek, sadece sözdizimiyle eşleşmesi nedeniyle, bu yorumdaki kelimelerin her birinin bir URI olduğunu söylemek gibidir.
hvd

11

İle awk, $NFalan sayısına bakılmaksızın, son alanı elde etmek için kullanabilirsiniz :

awk -F / '{print $NF}'

Bu dizeyi kabuk değişkeninde saklarsanız, şunları kullanabilirsiniz:

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

6

Gönderilen cevapların çoğu, örneğin aşağıdakiler gibi sorgu dizeleri veya hedefler içeren URL’lerde sağlam değildir:

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

Python'un standart kütüphanesinde URL ayrıştırması var; Bunu yapmasına izin vermek daha kolay. Örneğin,

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

Bunu python3 -cbir kabuk betiğinde kullanmak için tek bir parçaya sığdırabilirsiniz:

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

(Ayrıca, okunabilirlik için komut dosyasını da bozabilirsiniz. Yeni 'satırlar koymanıza izin verir.)

Tabii ki, şimdi kabuk betiğiniz Python'a bağımlı.

(URL'nin yol bileşeninin kök ( /);


1

Bir yöntem rev URL'ye daha sonra alanı kesip revtekrar açmaktır. Örneğin:

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

Çıktı:

file.jar 

Örnek 2:

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

Çıktı:

file.jar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.