Skip to content

Linux Bash Shell (六) 根据文件扩展名对文件名进行切片

前言

一些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
Published inbash shell

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *

Author Copyriht by BackendSite