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?
dirname $url
. Lub grep -o 'http://[^/]*' <<<$url
.
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?
dirname $url
. Lub grep -o 'http://[^/]*' <<<$url
.
Odpowiedzi:
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.
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 h
nie /
.
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 */
.
basename
(1) działa również z adresami URL, więc możesz po prostu:
url=http://www.foo.bar/file.ext; basename $url
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