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?

ManuelSchneid3r
źródło
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.

ManuelSchneid3r
źródło
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 */.

derobert
źródło
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
Frank Zdarsky
źródło
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

Peter.O
źródło