有些时候,我们可能会需要在保留扩展名的同时修改文件名或者是切换文件格式,亦或许是保留文件名的同时修改扩展名。shell所提供的一些小工具可以使得这些工作变得更加简单。
-
示例
# 现在我们有一个名为 test.jpg 的文件,我们可以借助 "%" 操作符轻松的将 "名称.扩展" 这种形式的 “名称” 部分提取出来。
filename="test.jpg"
name=${filename%.*}
echo "$name"
打印结果: test
要提取扩展名同样很简单,只需要借助操作符 "#" 即可轻松实现
filename="test.jpg"
postfix=${filename#*.}
echo "$postfix"
打印结果: jpg
-
原理
% 和 %%
- 首先在提取文件名的过程中我们使用了 "%" 操作,形式类似于 ${var%.*}
- ${var%.*} 代表从 “var” 中删除,"%" 右侧匹配到的通配符
- 例如我们上面的 test.jpg 就会找到 test.jpg 中的 .jpg 进行删除,并把它赋值给 name
- % 代表的是非贪婪模式进行匹配,并且查找顺序是从右往左进行查找的,而非贪婪模式就代表尽可能少的去匹配通配符的结果,与之对应的还有 "%%" 代表以贪婪模式进行匹配(尽可能多的去匹配结果)
再次举例:
var=aaa.bbb.ccc.ddd
echo "${var%.*}"
结果: aaa.bbb.ccc # "%" 从右往左进行非贪婪匹配(尽可能少的进行匹配)
echo "${var%%.*}"
结果:aaa # "%%" 从右往左进行贪婪匹配 (尽可能多的进行匹配)
# 和 ##
- 在提取文件扩展名中,我们使用到了 "#" , 和 “%” 类似 “#” 表示以非贪婪模式进行匹配,"##" 表示以 贪婪模式进行匹配
- 与 "%" 不同的是 “%” 是从右往左进行匹配,而 "#" 是从左往右进行匹配的
示例
var=aaa.bbb.ccc.ddd
echo "${var#*.}"
结果: bbb.ccc.ddd
echo "${var##*.}"
结果: ddd
-
扩展
# 可以通过 % 以及 # 提取一个域名的不同部分
url="www.baidu.com"
echo "${url%.*}" # 以非贪婪模式从右往左移除 .* 匹配到的部分
结果: www.baidu
echo "${url%%.*}" # 以贪婪模式从右往左移除 .* 匹配到的部分
结果: www
echo "${url#*.}" # 以非贪婪模式从左往右移除 *. 匹配到的部分
结果: baidu.com
echo "${url##*.}" # 以贪婪模式从左往右移除 *. 匹配到的部分
结果: com
-
完了