私はhttpリンクを持っています:
http://www.test.com/abc/def/efg/file.jar
最後の部分file.jarを変数に保存したいので、出力文字列は「file.jar」です。
条件:リンクの長さが異なる場合があります。例:
http://www.test.com/abc/def/file.jar.
私はそのようにしてみました:
awk -F'/' '{print $7}'
、しかし問題はURLの長さなので、どんなURLの長さでも使えるコマンドが必要です。
これにawk
を使用するとうまくいきますが、榴弾砲を使って鹿を狩るようなものです。既に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'
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
awk
を使用すると、$NF
、フィールドの数に関係なく、最後のフィールドを取得するには:
awk -F / '{print $NF}'
その文字列をシェル変数に格納すると、次のように使用できます。
a=http://www.test.com/abc/def/efg/file.jar
printf '%s\n' "${a##*/}"
投稿された回答のほとんどは、たとえば次のようなクエリ文字列またはターゲットを含む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
に圧縮して、シェルスクリプトで使用できます。
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のパスコンポーネントがルート(/
)である場合を処理しようとするかどうかが少しわかりません。重要な場合は調整/テストしてください。)
1つの方法は、URLをrev
してからフィールドを切り取り、次にrev
をもう一度行うことです。例えば:
echo 'http://www.test.com/abc/def/efg/file.jar ' | rev | cut -d '/' -f 1 | rev
出力:
file.jar
例2:
echo 'http://www.test.com/abc/cscsc/sccsc/def/efg/file.jar ' | rev | cut -d '/' -f 1 | rev
出力:
file.jar