1.删除字符串的子字符串
在处理文件的路径名的时候经常需要删除字符串的一部分,如在获得文件的路径名后只需要获取文件名本身,这时则需要删除路径中除文件名外的其它所有字符串。有时需要获得文件的父目录,这时则需要删除绝对路径名中的文件名和文件名前面的/,只留下包含父目录的字符串。
删除字符串的部分子字符串的语法 | 说明 |
---|---|
${str_var%pattern} | 删除字符串str_var中匹配模式的尽量少的最右边的子字符串 |
${str_var%%pattern} | 删除字符串str_var中匹配模式的尽量多的最右边的子字符串 |
${str_var#pattern} | 删除字符串str_var中匹配模式的尽量少的最左边的子字符串 |
${str_var##pattern} | 删除字符串str_var中匹配模式的尽量多的最左边的子字符串 |
删除最右边和最左边的子字符串示例:
str1='/u01/app/oracle/admin/oracle'
#删除字符串str1中匹配oracle的尽量少的最右边的子字符串
echo ${str1%/oracle}
/u01/app/oracle/admin
echo ${str1%/oracle*}
/u01/app/oracle/admin
#删除字符串str1中匹配oracle的尽量多的最右边的子字符串
echo ${str1%%/oracle}
/u01/app/oracle/admin
#使用oracle*来匹配/oracle/admin/oracle
echo ${str1%%/oracle*}
/u01/app
#删除字符串str2中匹配oracle的尽量少的最左边的子字符串
str2='/oracle/app/oracle'
echo ${str2#/oracle}
/app/oracle
echo ${str2#/oracle*}
/app/oracle
#删除字符串str2中匹配oracle的尽量多的最左边的子字符串
echo ${str2##/oracle}
/app/oracle
#由于尽量多的匹配左边的字符串/oracle*将整个字符串都匹配了,因此删除后只为空
echo ${str2##/oracle*}
获取路径中的文件名和文件名后缀:
str3='/u01/app/oracle/admin/orcl/scripts/orcl1.sql'
echo ${str3##*/}
orcl1.sql
#等价于basename命令的输出
echo $(basename $str3)
orcl1.sql
#获取文件名的后缀
echo ${str3##*.}
sql
#去掉文件名的后缀
echo ${str3%%.*}
/u01/app/oracle/admin/orcl/scripts/orcl1
获取文件的父目录:
str3='/u01/app/oracle/admin/orcl/scripts/orcl1.sql'
echo ${str3%/*}
/u01/app/oracle/admin/orcl/scripts
#等价于dirname的命令输出
echo $(dirname $str3)
/u01/app/oracle/admin/orcl/scripts
2.去除字符串前后的空白字符
当字符串前后含有空格或tab空白字符时,最简单的方法是将字符串赋值给一个变量,然后输出变量即可以去除字符串前后的空白字符。
str=`echo ' A B C '`
echo $str
A B C
也可以使用awk的替换命令进行前后空白字符串的去除。
echo ' A B C ' | awk '{gsub(/^[ ]+|[ ]+$/, "");print}'
A B C
echo ' A B C ' | awk '{gsub(/^\s+|\s+$/, "");print}'
A B C
或者使用sed命令进行前后空白字符串的去除。
echo ' A B C ' | sed -r 's/^[ \t]+(.*)[ \t]+$/\1/g'
A B C
echo ' A B C ' | sed -r 's/^\s+(.*)\s+$/\1/g'
A B C
3.截取字符串特定位置的子字符串
在截取字符串特定位置开始的一部分子字符串时,如果起始位置左边开始计数,截取格式如下:
${string: start: length}
如果起始位置想从右边开始计数,截取格式如下:
${string: 0-start: length}
#从左边数起的第5个字符后开始
string='123456789'
echo ${string:5:4}
6789
#从右边数起的第5个字符后开始
${string:0-5:4}
5678