Wyodrębnij podstawową nazwę pliku z adresu URL za pomocą bash


15
url=http://www.foo.bar/file.ext; echo ${url##/*}

Spodziewałem się, że ten kod zostanie wydrukowany file.ext, ale wypisze cały adres URL. Dlaczego? Jak mogę wyodrębnić nazwę pliku?


Okej, oczekuję, że coś złego się stanie. Cóż, chcę wyodrębnić plik.ext
ManuelSchneid3r

Próbujesz odciąć koniec sznurka? Spróbować dirname $url. Lub grep -o 'http://[^/]*' <<<$url.
Kevin

Odpowiedzi:


28

Ponieważ słowo musi pasować do ciętego łańcucha. Powinno to wyglądać następująco:

url="http://www.foo.bar/file.ext"; echo "${url##*/}"

Dzięki derobert, poprowadziłeś mnie we właściwym kierunku.


Hah, oboje zdajemy sobie z tego sprawę w tym samym czasie. Cieszę się, że mogę pomóc.
derobert

10

Aby zacytować stronę podręcznika:

${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, […]

/*nie pasuje do początku, ponieważ Twój adres URL zaczyna się od hnie /.

Trywialny sposób na zrobienie tego, czego szukasz (zgodnie z Twoim komentarzem) to echo "$url" | rev | cut -d / -f 1 | rev. Ale oczywiście da to interesujące wyniki dla adresów URL kończących się ukośnikiem.

Innym sposobem na zrobienie tego, co chcesz, może być użycie wzorca */.


Cieszę się, że wyjaśniłeś, co należy zrobić, a cytat ze strony to ogromny plus! To bardzo mi pomogło! Dzięki jeszcze raz! :)
Fadi

6

basename(1) działa również z adresami URL, więc możesz po prostu:

url=http://www.foo.bar/file.ext; basename $url

4

Zobacz także: Bash Extended Globbing , choć w tym przypadku rozszerzony glob nie jest niezbędny.

 shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}

Wynik: file.ext

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.