url=http://www.foo.bar/file.ext; echo ${url##/*}
このコードは印刷することを期待していましたが、file.ext
完全なURLが印刷されました。なぜ?ファイル名を抽出するには?
答え1
単語が切り捨てられる文字列と一致する必要があるからです。次のようにする必要があります。
$ url="http://www.foo.bar/file.ext"; echo "${url##*/}"
file.ext
ありがとうございます。あなたは私を正しい方向に導きました。また、@frank-zdarskyが述べたように、basename
GNU coreutilsにあり、ほとんどのプラットフォームでも利用できます。
$ basename "http://www.foo.bar/file.ext"
file.ext
答え2
マンページ引用:
${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, […]
/*
URLがh
notで始まるので、は先頭と一致しません/
。
あなたの意見に基づいてあなたが探していることを行う簡単な方法はですecho "$url" | rev | cut -d / -f 1 | rev
。もちろん、スラッシュで終わるURLに関する興味深い結果があります。
必要なものを実行する別の方法はパターンを使用することです*/
。
答え3
basename
(1)はURLにも適用されるため、簡単に次のことができます。
url=http://www.foo.bar/file.ext; basename $url
答え4
また見なさい:Bash拡張ワイルドカード、この場合は拡張globは必要ありません。
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
出力:file.ext