前言
一些shell脚本中需要根据文件的类型进行操作,比如对文件进行重命名但是需要保留扩展名。
在java等语言中我们知道有charAt,substring等方法可以找出文件名和扩展名,但是shell中并没有这些内置方法,
在shell中如何对文件名进行切片呢,我们一起来学些吧
利用${VAR%.*}
抽取文件名(不包含扩展名)
一个完整的文件名通常满足name.extension
的格式,比如test.txt
, a.out
, c.exe
等等。
那么如何抽取文件名,而不包含扩展名呢?
答案就是利用${%.*}
。看一个具体的例子
file_jpg="sample.jpg"
name=${file_jpg%.*}
echo File name is: $name
File name is: sample
那么${VAR%.*}
是如何工作的呢?
${VAR%.*}
删除$VAR变量中和%右边的通配符(这里是.*)相匹配的部分。并且是在$VAR变量从右到左的方向去匹配通配符- 以
VAR=sample.jpg
为例,从右到左匹配.*的部分是.jpg,因此从$VAR中删除.jpg后就是sample
其中%
是一个非贪婪的的操作。%%
是一个贪婪的操作,举个例子:
VAR=hack.fun.book.txt
echo ${VAR%.*}
hack.fun.book
echo ${VAR%%.*}
hack
%%
从右到左贪婪的匹配.*,最后会匹配到.fun.book.txt
利用${VAR#*.}
抽取文件扩展名
echo $file_jpg
echo ${file_jpg#*.}
sample.jpg
jpg
${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
Be First to Comment