回答:
これを使用awk
することは機能しますが、それはhow弾砲による鹿狩りのようなものです。既にURLを公開している場合、それをシェル変数に入れてbash
の組み込みパラメーター置換を使用すると、必要な処理を簡単に実行できます。
$ myurl='http://www.example.com/long/path/to/example/file.ext'
$ echo ${myurl##*/}
file.ext
これが機能する方法は、「* /」に貪欲に一致するプレフィックスを削除することです。これは、##
オペレーターが行うことです:
${haystack##needle} # removes any matching 'needle' from the
# beginning of the variable 'haystack'
file=${myurl##*/}
、その後にバックアップする貪欲逆マッチングを使用して?
(!それをエスケープすることを忘れないでください)、例えばecho ${file%%\?*}
basename
そしてdirname
、あまりにもURLの仕事に良いです:
> url="http://www.test.com/abc/def/efg/file.jar"
> basename "$url"; basename -s .jar "$url"; dirname "$url"
file.jar
file
http://www.test.com/abc/def/efg
/relative/URI/with/absolute/path/to/resource.txt
、relative/path/to/resource.txt
、../../../resource.txt
およびresource.txt
en.wikipedia.org/wiki/...
/relative/path
、ファイルシステムパスまたは相対URIのいずれかです。しかし、それらのどれがコンテキストに依存します。ファイルシステムパスとして使用される場合、URIではありません。URIとして使用される場合、ファイルシステムパスではありません。たまたま構文に一致するという理由だけでURIだと言うのは、このコメントの各単語もURIだと言うようなものです。
投稿された回答のほとんどは、次のようなクエリ文字列またはターゲットを含むURLに対して堅牢ではありません。
https://example.com/this/is/a/path?query#target
Pythonの標準ライブラリにはURL解析があります。それをさせるのは簡単です。例えば、
from urllib import parse
import sys
path = parse.urlparse(sys.stdin.read().strip()).path
print("/" if not path or path == "/" else path.rsplit("/", 1)[-1])
python3 -c
シェルスクリプトで使用するために、それを1つに圧縮できます。
echo 'https://example.com/this/is/a/path/componets?query#target' \
| python3 -c 'from urllib import parse; import sys; path = parse.urlparse(sys.stdin.read().strip()).path; print("/" if not path or path == "/" else path.rsplit("/", 1)[-1])'
(読みやすくするために、スクリプトを分割することもでき'
ます。改行を挿入できます。)
もちろん、シェルスクリプトはPythonに依存しています。
(URLのパスコンポーネントがルート(/
)であるケースを処理しようとするかどうかについては少し確信が持てません。それが問題になる場合は調整/テストしてください。)