博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 切分文件名或文件扩展名
阅读量:6835 次
发布时间:2019-06-26

本文共 1393 字,大约阅读时间需要 4 分钟。

hot3.png

有一些脚本是根据文件名进行各种处理的。 shell所具有的一些内建功能可以依据不同的情况来切分文件名。

借助%操作符可以轻松的将名称部分从"名称.扩展名"这种格式中提取出来。可以按照下面的方法从list.txt中提取名称。

# file_name="list.txt"# name=${file_name%.*}# echo File name is: $name输出结果:File name is: list

下一个是将文件名的扩展名部分提取出来,这可以借助#操作符实现。

# name=${file_name#*.}# echo Extension is: $name输出结果:Extension is txt

工作原理: 在第一个任务里,为了从"名称.扩展名"这个格式中提取名称,我们使用了%操作符。

${VAR%.*} 的含义如下:

从$VAR中删除位于%右侧的通配符(在前例中是.*)所有匹配的字符串。通配符从右向左进行匹配。

给$VAR赋值,VAR="list.txt"。那么,通配符从右向左就会匹配到.txt,因此,从$VAR中删匹配的结果,就会得到输出list

%属于非贪婪操作,它从右到左找出匹配通配符最短的结果。还有另外一个操作符%%,这个操作符与%相似,但是它的行为模式却是贪婪的,这说明它会匹配符合条件的最长的字符。

比如,我们有这样一个文件:

# VAR="hack.fun.book.txt"# echo ${VAR%.*}输出结果:hack.fun.book

操作符%使用.*从右到左执行非贪婪匹配(.txt)

使用%%操作符:

# echo ${VAR%%.*}输出结果:hack

操作符%%使用.*从右到左执行贪婪匹配(.fun.book.txt)

在第二个任务中,我们用#操作符从文件名中提取扩展名。这个操作与%类似,不过求值方向是从左到右。

${VAR#*.}的含义如下:

从$VAR中删除位于#右侧的通配符(即在前例中使用的*.)所匹配的字符串。通配符从左向右进行匹配。

和%%类似,#也有一个贪婪操作符##

##从左向右进行贪婪匹配,并从指定变量中删除匹配结果。

来看一个例子:

# VAR="hack.fun.book.txt"

使用#操作符:(非贪婪)

# echo ${VAR#*.}输出结果:fun.book.txt

使用##操作符:(贪婪)

# echo ${VAR##*.}输出结果:.txt

注意:

因为文件名中可能包含多个'.'字符,所以相较于#,##更适合从文件名中提取扩展名。##执行的是贪婪匹配,因此总是能够准确的提取出扩展名。

这里我们使用一个域名来做个总结:URL="www.google.com"

# echo ${URL%.*}        #移除.*所匹配的最右边的内容输出:www.google# echo ${URL%%.*}    #将从右边开始一直匹配到最左边的.*移除(贪婪操作符)输出:www# echo ${URL#*.}        #移除*.所匹配的最左边内容输出:google.com#echo ${URL##*.}    #将从左边开始一直匹配到最右边的*.移除(贪婪操作符)输出:com

转载于:https://my.oschina.net/u/3136306/blog/821636

你可能感兴趣的文章
vs2008打开aspx设计界面无响应问题解决方法
查看>>
How to access the folder of Android
查看>>
8天学通MongoDB——第三天 细说高级操作
查看>>
centos 重启网络服务的方法
查看>>
Aspose.Cells小实例
查看>>
C# winform 获取当前路径
查看>>
groovy execute
查看>>
java IO 解析
查看>>
SQL - SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)[转]...
查看>>
我也能做CTO之程序员职业规划
查看>>
OCCI入门(VC2010下配置)
查看>>
Double linked list structure
查看>>
【剑指Offer】面试招聘题目2:重建二叉树
查看>>
对路径的访问被拒绝
查看>>
PHP 短连接生成
查看>>
lftp 4.4.0 发布,命令行的FTP工具
查看>>
uva 10152 ShellSort
查看>>
经典网页设计:20个与众不同的 Flash 网站设计作品
查看>>
java.util.concurrent.locks.Condition 例子程序探讨
查看>>
NYOJ 506
查看>>