Shell语言用例

字符串操作之:子串替换

2018-10-07  本文已影响3人  CodingCode

字符串操作之:子串替换

+----------------------+------------+-----------------------+-----------------------------+
| ${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。

  1. *用来匹配任意字符。

举例:
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

如果要执行如下的目标:

  1. 把所有的大写字母转换成小写。
  2. 把所有连续的b替换成c

则都不知道怎么处理。

几个常用例子:

  1. 更改文件后缀名
    如果文件名包含扩展名,那么把后缀名改成.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
  1. 提取路径名,提取文件名,提取扩展名
    请参考:字符串操作之 - 截取匹配

  2. 把所有的数字替换成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"

上一篇下一篇

猜你喜欢

热点阅读