字符串操作之:子串替换
+----------------------+------------+-----------------------+-----------------------------+
| ${string/<pattern>/<replacement>} | use replacement to replace the first matched <pattern> |
| ${string//<pattern>/<replacement>} | use replacement to replace ALL matched <pattern> |
| ${string/#<pattern>/<replacement>} | use replacement to replace the matched <pattern>, if string start with <pattern> |
| ${string/%<pattern>/<replacement>} | use replacement to replace the matched <pattern>, if string end with <pattern> |
+----------------------+------------------+-----------------------+-----------------------+
先说注意的地方:
这里的pattern虽然说是pattern,但实际上并不能支持比较全的patter,只是非常简单的pattern而已,所以我的理解他就是一个文本字符串,而不是pattern;如果需要完整的支持patter,还希望使用其他工具,例如sed。
- *用来匹配任意字符。
举例:
VAR="AAbbAAbbb"
目标 | 命令格式 | sed命令 | 输出 |
---|---|---|---|
把第一个AA替换成XX | ${VAR/AA/XX} | XXbbAAbbb | |
把所有AA替换成XX | ${VAR//AA/X } | XXbbXXbbb | |
如果以AAbb开头,则把匹配的开头替换成XX | ${VAR/#AAbb/XX} | XXAAbbb | |
如果以AAbbb结尾,则把匹配的结尾替换成XX | ${VAR/%AAbbb/XX} | AAbbXX | |
删除所有的bb字符 | ${VAR//bb/} | AAAAb |
如果要执行如下的目标:
- 把所有的大写字母转换成小写。
- 把所有连续的b替换成c
则都不知道怎么处理。
几个常用例子:
- 更改文件后缀名
如果文件名包含扩展名,那么把后缀名改成.ksh
echo ${VAR/%.*/.ksh}
VAR | OUTPUT |
---|---|
VAR="aaa.sh" | aaa.ksh |
VAR="/usr/home/aaa.sh" | /usr/home/aaa.ksh |
VAR="/usr/home/aaa" | /usr/home/aaa |
这个例子使用了任何扩展名,当然也可以指定扩展名,例如把所有的.sh替换成.ksh,其他的不变。
echo ${VAR/%.sh/.ksh}
VAR | OUTPUT |
---|---|
VAR="aaa.sh" | aaa.ksh |
VAR="/usr/home/aaa.bak" | /usr/home/aaa.bak |
VAR="/usr/home/aaa" | /usr/home/aaa |
-
提取路径名,提取文件名,提取扩展名
请参考:字符串操作之 - 截取匹配 -
把所有的数字替换成X
如果文件名包含扩展名,那么把后缀名改成.ksh
echo ${VAR//[0-9]/X}
VAR | OUTPUT |
---|---|
VAR="123" | XXX |
VAR="AAA123BBB456CCC" | AAAXXXBBBXXXCCC |
那么是不是可以把所有的字母替换成数字呢?例如,下面例子把所有的大写字母替换成数字0。
echo ${VAR//[A-X]/0}
VAR | OUTPUT |
---|---|
VAR="123" | 123 |
VAR="AAA123BBB456CCC" | 000123000456000 |
那么进一步,能不能把所有的连续字母替换成一个其他字符呢,例如替换所有的连续大写字母为一个字符X呢,AA=>X, ABC=>X,AABBaCCDD=>XaX呢?
类似:echo ${VAR//[A-X]\+/X}
输出:AABBaCCDD
可见结果没有用处,和我们想的不一样。
而用sed工具,可以非常方便的实现功能:
echo ${VAR} | sed -e "s/[A-Z]\+/X/g"
最后输出是"XaX"
网友评论