美文网首页Shell语言用例
字符串操作之:子串替换

字符串操作之:子串替换

作者: CodingCode | 来源:发表于2018-10-07 10:56 被阅读3次

    字符串操作之:子串替换

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

    相关文章

      网友评论

        本文标题:字符串操作之:子串替换

        本文链接:https://www.haomeiwen.com/subject/zankaftx.html