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.