web-dev-qa-db-ja.com

バッシュでhttpリンクの最後の部分を取得する方法?

私は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の長さでも使えるコマンドが必要です。

26
FunTomas

これに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'
52
DopeGhoti

basenamedirnameは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
22
Fedor Dikarev

awkを使用すると、$NF、フィールドの数に関係なく、最後のフィールドを取得するには:

awk -F / '{print $NF}'

その文字列をシェル変数に格納すると、次のように使用できます。

a=http://www.test.com/abc/def/efg/file.jar
printf '%s\n' "${a##*/}"
11
cuonglm

投稿された回答のほとんどは、たとえば次のようなクエリ文字列またはターゲットを含む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のパスコンポーネントがルート(/)である場合を処理しようとするかどうかが少しわかりません。重要な場合は調整/テストしてください。)

6
Thanatos

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
1
Nived Thanima