shell脚本之切分文件名与扩展名

注:区分好通配符和正则表达式的符号含义

通配符:一般只用于文件名匹配
1、*表示匹配任意长度的任意字符
2、? 表示匹配一个任意字符
3、[] 表示匹配括号中列出的字符中的任意一个
4、[a-d]表示aAbBcCd

shell脚本都涉及修改文件名的操作。我们可能需要在保留扩展名的同时修改文件名、转换文件格式(保留文件名的同时修改扩展名)或提取部分文件名。

实战演练(提取文件名):

[root@Script-test ~]# var="index.html"
[root@Script-test ~]# echo${var%.*}        %操作符
index

原理:

  • 从 $VAR中删除位于%右侧的通配符(在上例中是.*)所匹配的字符串。通配符从右向左进行匹配。
  • 给VAR赋值,即VAR=index.html。通配符从右向左匹配到的内容是.html,因此从$VAR中删除匹配结果,得到输出index。

%属于非贪婪(non-greedy)操作。它从右向左找出匹配通配符的最短结果。还有另一个操作符%%,它与%相似,但行为模式却是贪婪的,这意味着它会匹配符合通配符的最长结果。例如,

[root@Script-test ~]# VAR=hack.fun.book.txt         非贪婪模式(%)
[root@Script-test ~]# echo ${VAR%.*}
hack.fun.book

[root@Script-test ~]# VAR=hack.fun.book.txt        贪婪模式(%%)
[root@Script-test ~]# echo ${VAR%%.*}
hack

实战演练(提取扩展名):

原理:#操作符可以从文件名中提取扩展名。这个操作符与%类似,不过求值方向是从左向右。

[root@Script-test ~]# var=test.jpg
[root@Script-test ~]# echo ${var#*.}           #操作符
jpg
[root@Script-test ~]# var="www.baidu.com"
[root@Script-test ~]# echo ${var##*.}           贪婪模式(##)
com

[root@Script-test ~]# echo ${var#*.}           非贪婪模式(#)
baidu.com

技巧:切割扩展名的时候贪婪模式(##)更适用,文件名可能会包含多个.字符;譬如var=hack.fun.book.txt,用贪婪模式(##)则可切割出txt

总结:

  1. 获取文件名使用% (从右向左匹配)
  2. 获取扩展名使用# (从左向右匹配)

字符串替换

[root@Script-test test]# var="my.file.txt.my"

[root@Script-test test]# echo ${var/my/test}     将第一个my替换成test
 test.file.txt.my

[root@Script-test test]# echo ${var//my/test}   将所有my替换成test
test.file.txt.test

单一符号是最小匹配;两个符号是最大匹配

[root@Script-test test]# var="my.file.txt.my"

[root@Script-test test]# echo ${var:0:5}    从左边开始数提取5个字符
my.fi

[root@Script-test test]# echo ${var:5:5}  提取第 5 个字节右边的连续5个字节
le.tx
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值