Answers:
使用awk
它可以工作,但这有点像是用榴弹炮猎鹿。如果您已经裸露了URL,那么将其放入shell变量并使用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
,以在shell脚本中使用:
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])'
(出于可读性考虑,您也可以保留该脚本,以便'
放入换行符。)
当然,现在您的Shell脚本依赖于Python。
(我不太确定if是否尝试处理URL的路径部分为根(/
)的情况;请调整/测试对您而言是否重要。)
一种方法是对rev
URL进行剪切,然后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