Shell中判断字符串包含关系
通过grep来判断
1 | str1="abcdefgh" |
先打印长字符串,然后在长字符串中 grep 查找要搜索的字符串,用变量result记录结果,如果结果不为空,说明str1包含str2。如果结果为空,说明不包含。这个方法充分利用了grep 的特性,最为简洁。
字符串运算符
1 | str1="abcdefgh" |
利用字符串运算符 =~ 直接判断str1是否包含str2。
利用通配符
1 | str1="abcdefgh" |
用通配符*号代理str1中非str2的部分,如果结果相等说明包含,反之不包含。
利用case in 语句
1 | str1="abcdefgh" |
利用替换
1 | str1="abcdefgh" |
字符串替换
基于Pattern Matching的子串替换
替换第一个:
1 | ${STR/$OLD/$NEW} |
替换所有:
1 | ${STR//$OLD/$NEW} |
替换开头。如果STR以OLD串开头,则替换:
1 | ${STR/#$OLD/$NEW} |
替换结尾。如果STR以OLD串结尾,则替换:
1 | ${STR/%$OLD/$NEW} |
注意:不能使用正则表达式,只能使用?的Shell扩展。只能用shell通配符如 ? [list] [!list] [a-z]。
如果被替换串包含/字符,那么要转义,写成\/。
示例:
1 | [user@psvmc ~]# STR="Hello World" |
使用sed命令实现正则表达式替换
1 | echo "$STR" | sed "s/$OLD/$NEW/" |
将STR中的OLD子串替换成NEW。
示例:
1 | [user@psvmc ~]# STR="123456789" |
使用tr命令实现字符集合的替换
使用tr命令可以实现字符的替换,并且可以是从一批字符到另一批字符的替换。比如小写字母变成大写字母,或者反过来。
1 | [user@psvmc ~]# echo "bash" | tr "[a-z]" "[A-Z]" |
字符串删除
基于Pattern Matching的子串删除
子串删除是一种特殊的替换
将STR中第一个SUB子串删除:
1 | ${STR/$SUB} |
将STR中所有SUB子串删除:
1 | ${STR//$SUB} |
去头,从开头去除最短匹配前缀:
1 | ${STR#$PREFIX} |
去头,从开头去除最长匹配前缀:
1 | ${STR##$PREFIX} |
去尾,从结尾去除最短匹配后缀:
1 | ${STR%$SUFFIX} |
去尾,从结尾去除最长匹配后缀:
1 | ${STR%%$SUFFIX} |
注意:经常会记错
#
和%
的含义,有一个帮助记忆的方法
看一下键盘,#
在$
之前,%
在$
之后,就知道#
去头,%
去尾。注意:不能使用正则表达式,只能使用
?*
的Shell扩展。
示例:获取字符串的前缀和后缀
1 | file_path='aa.jpg' |
路径字符串的处理
取目录部分:
1 | dirname ${FULLPATH} |
取文件名部分:
1 | basename ${FULLPATH} |
取文件名部分,并且去掉指定的扩展名:
1 | basename {FULLPATH} {EXT} |
示例:
1 | [user@psvmc ~]# FULLPATH=/user/work/project/backup.tar.gz |
取目录部分:
1 | ${FULLPATH%/*} |
取文件名称:
1 | FILE=${FULLPATH##*/} |
取最短基本名称:
1 | ${FILE%%.*} |
取最长基本名称:
1 | ${FILE%.*} |
取最短扩展名:
1 | ${FILE##*.} |
取最长扩展名:
1 | ${FILE#*.} |
示例:
1 | [user@psvmc ~]# FULLPATH=/user/work/project/backup.tar.gz |