`

Shell 字符串处理、获取文件名和后缀名

 
阅读更多
代码:
file=”thisfile.txt”
echo “filename: ${file%.*}”
echo “extension: ${file##*.}”
输出:
filename: thisfile
extension: txt
 
 
 
附:

Bash字符串处理

基于Pattern Matching的子串替换
${STR/$OLD/$NEW}
替换第一个。
${STR//$OLD/$NEW}
替换所有。
注意:不能使用正则表达式,只能使用?*的Shell扩展。只能用shell通配符如 * ?  [list] [!list] [a-z]。
${STR/#$OLD/$NEW}
替换开头。如果STR以OLD串开头,则替换。
${STR/%$OLD/$NEW}
替换结尾。如果STR以OLD串结尾,则替换。
 
[user@laptop ~]# STR=”Hello World” 
[user@laptop ~]# echo ${STR/o/O} 
HellO World
[user@laptop ~]# echo ${STR//o/O} 
HellO WOrld
[user@laptop ~]# STR=”Hello World” 
[user@laptop ~]# echo ${STR/#He/he} 
hello World
[user@laptop ~]# echo ${STR/#o/he} 
Hello World
[user@laptop ~]# echo ${STR/%He/he} 
Hello World
[user@laptop ~]# echo ${STR/%ld/lD} 
Hello WorlD
 
如果被替换串包含/字符,那么要转义,写成\/。
 
[user@laptop ~]# filename=”/user/admin/monitoring/process.sh” 
[user@laptop ~]# echo ${filename/#\/user/\/tmp} 
/tmp/admin/monitoring/process.sh
[user@laptop ~]# echo ${filename/%.*/.ksh} 
/user/admin/monitoring/process.ksh
[user@laptop ~]#
 
将环境变量PATH的各个目录分开,每行显示一个。
echo -e ${PATH/:/\n}
 
[user@laptop ctmw]# echo $PATH 
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/apache/apache-ant-1.7.1/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/user/bin
[user@laptop ctmw]# echo -e ${PATH//:/’\n’} 
/usr/kerberos/sbin
/usr/kerberos/bin
/usr/apache/apache-ant-1.7.1/bin
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/user/bin
[user@laptop ctmw]# echo “${PATH//:/$’\n’}” 
/usr/kerberos/sbin
/usr/kerberos/bin
/usr/apache/apache-ant-1.7.1/bin
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/user/bin
 
基于Pattern Matching的子串删除
子串删除是一种特殊的替换
${STR/$SUB}
将STR中第一个SUB子串删除
${STR//$SUB}
将STR中所有SUB子串删除
${STR#$PREFIX}
去头,从开头去除最短匹配前缀
${STR##$PREFIX}
去头,从开头去除最长匹配前缀
${STR%$SUFFIX}
去尾,从结尾去除最短匹配后缀
${STR%%$SUFFIX}
去尾,从结尾去除最长匹配后缀
注意:经常会记错#和%的含义,有一个帮助记忆的方法
看一下键盘,#在$之前,%在$之后,就知道#去头,%去尾。
注意:不能使用正则表达式,只能使用?*的Shell扩展。
 
[user@laptop ~]# STR=”Hello World” 
[user@laptop ~]# echo ${STR#He} 
llo World
[user@laptop ~]# echo ${STR#He*o} 
World
[user@laptop ~]# echo ${STR##He*o} 
rld
[user@laptop ~]# PREFIX=”*o” 
[user@laptop ~]# echo ${STR#$PREFIX} 
World
[user@laptop ~]# echo ${STR##$PREFIX} 
rld
[user@laptop ~]# echo ${STR%o*} 
Hello W
[user@laptop ~]# echo ${STR%%o*} 
Hell
[user@laptop ~]# SUFFIX=”o*” 
[user@laptop ~]# echo ${STR%$SUFFIX} 
Hello W
[user@laptop ~]# echo ${STR%%$SUFFIX} 
Hell
 
典型应用:得到文件的扩展名
[user@laptop ~]# FILE=hello.jpg 
[user@laptop ~]# echo ${FILE##*.} 
jpg
 
 
使用sed命令实现正则表达式替换
使用sed命令可以进行正则表达式的替换。
echo “$STR” | sed “s/$OLD/$NEW/”
将STR中的OLD子串替换成NEW。
 
[user@laptop ~]# STR=”123456789″ 
[user@laptop ~]# echo “$STR” | sed s/345/OK/ 
12OK6789
[user@laptop ~]# OLD=345 
[user@laptop ~]# NEW=OK 
[user@laptop ~]# echo “$STR” | sed “s/$OLD/$NEW/” 
12OK6789
 
使用tr命令实现字符集合的替换
使用tr命令可以实现字符的替换,并且可以是从一批字符到另一批字符的替换。比如小写字母变成大写字母,或者反过来。
 
[user@laptop ~]# echo “bash” | tr “[a-z]” “[b-z]” 
cbti
上面的命令是将原串中的a替换成b,被替换成c,以此类推。
 
网上问题:Linux中 有没有一个命令可以将 字符串中出现的 +或者- 替换成对应的-或者+  即 “+” ——> “-”  “-”——>”+”  例如 GMT+8-9变成 GMT-8+9
 
[user@laptop ~]# echo “GMT+8-9″ | sed ‘s/-/#/g’ | sed ‘s/+/-/g’ | sed ‘s/#/+/g’ 
GMT-8+9
上面是网上提供的答案。如果用tr来实现,更简洁些。 
[user@laptop ~]# echo “GMT+8-9″ | tr “+-” “-+” 
GMT-8+9
 
路径字符串的处理
dirname ${FULLPATH}
取目录部分。
basename ${FULLPATH}
取文件名部分。
basename ${FULLPATH} ${EXT}
取文件名部分,并且去掉指定的扩展名。
 
[user@laptop ~]# FULLPATH=/user/work/project/backup.tar.gz 
[user@laptop ~]# dirname “$FULLPATH” 
/user/work/project
[user@laptop ~]# basename “$FULLPATH”    
backup.tar.gz
[user@laptop ~]# basename “$FULLPATH” .gz 
backup.tar
[user@laptop ~]# basename “$FULLPATH” .tar 
backup.tar.gz
[user@laptop ~]# basename “$FULLPATH” .tar.gz 
backup
 
取目录部分:${FULLPATH%/*}    
(类似 dirname “$FULLPATH”)
取文件名称:FILE=${FULLPATH##*/}
(类似 basename “$FULLPATH”)
取最短基本名称:${FILE%%.*}
取最长基本名称:${FILE%.*}
取最短扩展名:${FILE##*.}  或者  ${FULLPATH##*.}
取最长扩展名:${FILE#*.}  或者  ${FULLPATH#*.}
 
[user@laptop ~]# FULLPATH=/user/work/project/backup.tar.gz 
[user@laptop ~]# echo ${FULLPATH%/*} 
/user/work/project
[user@laptop ~]# dirname “$FULLPATH” 
/user/work/project
[user@laptop ~]# FILE=${FULLPATH##*/} 
[user@laptop ~]# echo $FILE 
backup.tar.gz
[user@laptop ~]# basename “$FULLPATH” 
backup.tar.gz
[user@laptop ~]# echo ${FILE%%.*} 
backup
[user@laptop ~]# echo ${FILE%.*} 
backup.tar
[user@laptop ~]# echo ${FILE##*.} 
gz
[user@laptop ~]# echo ${FILE#*.} 
tar.gz
分享到:
评论

相关推荐

    Shell字符串截取的详细方法

    通过熟练掌握这些Shell字符串截取的方法,你可以更加自如地处理各种字符串操作,提高脚本的效率和灵活性。在实际工作中,根据具体需求灵活运用这些技巧,会使你的Shell脚本编写变得更加得心应手。

    Shell获取文件的文件名和扩展名的例子

    在Shell脚本中,获取文件的文件名和扩展名是一项常见的需求,尤其在处理文件系统操作时尤为重要。本文将详细介绍如何利用Shell内置的功能来实现这一目标,并通过示例代码帮助读者更好地理解和掌握。 #### 基础概念 ...

    VC++根据文件后缀名获文件打开方式

    总的来说,通过VC++实现根据文件后缀名获取打开方式的过程涉及到对Windows API的深入理解和应用,包括读取注册表、解析路径模板以及使用特定的API函数。这个功能在很多应用场景中都很实用,比如自定义文件管理器或者...

    shell编程中的字符串截取方法小结

    最后,我们来看看按照指定要求分割字符串的一个例子,如获取文件名的后缀名。可以使用`cut`命令的`-d`选项定义分隔符(这里是`.`),`-f2`则表示选取第二个字段。例如,`ls -al | cut -d "." -f2`可以用来获取列出的...

    Shell命令批量修改图片文件名

    在文件重命名场景中,`sed`常用于简单的字符串替换任务。 #### 示例解析 接下来,我们将逐一分析文章中的示例命令,以便更深入地理解其工作原理。 ##### 去除文件名前缀“_” ```bash for i in `ls _*.png`; do ...

    linux shell example例子

    对于字符串处理,如`"${guestfile##*/}"`用于去除路径前缀,保留文件名部分。 ### 知识点六:Shell脚本菜单设计 其中一个脚本展示了如何设计一个简单的Shell菜单,使用`until`循环和`case`语句来构建多级菜单,...

    批量修改文件名 修改文件名

    - 替换:替换文件名中的特定字符串。 - 添加/删除前缀或后缀:在文件名前后增加或去除固定字符。 - 序列号:为文件添加递增或递减的数字序列。 - 时间戳:根据文件创建或修改日期进行重命名。 - 模式匹配:使用...

    Shell命令中的扩展和替换

    花括号扩展是Shell中一种非常实用的特性,它允许用户通过指定一系列的前缀和后缀,结合一个或多个中间变化值来生成一系列的字符串。这种扩展机制极大地提高了Shell脚本的灵活性和效率。例如: ```bash echo a{b,c}d...

    Linux shell脚本编写基础

    脚本的名称可以随意定义,不需要特殊的后缀名。通常脚本的执行是通过在命令行中输入脚本文件名加上前缀 "./" 来完成的。例如,脚本名为smartzip,执行时输入 "./smartzip" 即可。需要注意的是,脚本文件的第一行是...

    LNMP拾贝集

    此外,书中还介绍了如何遍历目录,以及如何实现文件和目录的批量操作,比如批量修改文件后缀名。 算法实现方面,包括了冒泡排序、二分查找、从1到n求和等经典算法,这些都是程序员应该熟练掌握的基础算法,对提高...

    Linux Shell批量编译

    `gcc $file -o ${file%.*}` 这一行代码中,`${file%.*}` 是另一种参数扩展语法,用于删除字符串后缀直到遇到第一个“.”为止,从而获取不带扩展名的文件名作为输出目标。 #### 四、IFS变量的作用 IFS(Internal ...

    很好的Shell总结教程

    ### Shell字符串处理之${} #### 2.1 获取字符串长度 可以使用`${#variable}`来获取字符串的长度,其中`variable`是包含字符串的变量名。例如: ```bash str="Hello World" len=${#str} echo "Length is: $len" # ...

    文件批量改名_批量修改文件名_

    5. **人性化的功能**:在批量改名时,一些工具会提供人性化功能,如自动编号、替换字符串、去除特殊字符、添加日期时间戳等。这些功能可以极大地简化工作流程,确保文件命名规范、易读。 6. **安全性与备份**:在...

    Android开发人员不得不收集的代码

    获取目录下所有后缀名为suffix的文件包括子目录 listFilesInDirWithFilter 获取目录下所有符合filter的文件 listFilesInDirWithFilter 获取目录下所有符合filter的文件包括子目录 listFilesInDirWithFilter 获取目录...

    跟我一起学Makefile

    Makefile中可以使用各种函数来处理字符串、文件名和执行shell命令。字符串函数包括替换、查找和过滤等操作;文件名操作函数可以提取文件路径、文件名和扩展名等。foreach、if、call和origin等是控制Makefile执行流程...

    详解Linux批量更改文件后缀名

    这里的正则表达式`s/\.c$/.h/`表示查找以`.c`结尾的字符串,并将其替换为`.h`。`$`符号代表行尾,确保只替换以`.c`结尾的文件。 而在CentOS 5.5系统中,`rename`命令的语法略有不同,你可以使用以下命令: ```bash...

    SQLite手工注入Getshell技巧.pdf

    - **注入示例**:假设存在一个查询字符串参数`id`,攻击者可以通过提交如下的请求来执行任意SQL语句: ```sql SELECT * FROM table WHERE id = 1 OR 1=1 --' ``` - **利用特殊文件**:利用前面创建的特殊格式...

    solaris技术指南017.PDF

    这些运算符非常有用,可以简化字符串处理任务,比如去除文件扩展名等。 ### 4. C Shell 中的变量修改符 C Shell 提供了以下变量修改符: - **:e**:删除变量值的前缀部分(以“.”结束的部分)。 - **:h**:删除...

Global site tag (gtag.js) - Google Analytics