说道截取字符串,我们常常会想到cut\awk等工具,其实shell自身截取字符串命令也很强大,下面以变量字符串url=https://liming.pub/post/shell-substring-removal/index.html为例介绍几种字符串截取和替换方法:

左删除

  • 最小匹配删除${var#Pattern},从$var中删除与$var从前到后最短匹配$Pattern的字符,即从左边开始删除第一个$Pattern匹配的字符。 如:

    1
    2
    
    echo ${url#*/} #/liming.pub/post/shell-substring-removal/index.html
    echo ${url#*.} #pub/post/shell-substring-removal/index.html
  • 最大匹配删除${var##Pattern},从$var中删除与$var从前到后最长匹配$Pattern的字符,即从左边开始删除最后一个$Pattern匹配的字符。 如:

    1
    2
    
    echo ${url##*/} #index.html
    echo ${url##*.} #html

右删除

  • 最小匹配删除${var%Pattern},从$var中删除与$var从后到前最短匹配$Pattern的字符,即从右边开始删除第一个$Pattern匹配的字符。 如:

    1
    2
    
    echo ${url%/*} #https://liming.pub/post/shell-substring-removal
    echo ${url%.*} #https://liming.pub/post/shell-substring-removal/index
  • 最大匹配删除${var%%Pattern},从$var中删除与$var从后到前最长匹配$Pattern的字符,即从右边开始删除最后一个$Pattern匹配的字符。 如:

    1
    2
    
    echo ${url%%/*} #https:
    echo ${url%%.*} #https://liming

抽取

  • ${var:pos},抽取从$pos开始到结尾。
  • ${var:pos:len},抽取从$pos开始$len长度的字符串。 bash echo ${url:8} #liming.pub/post/shell-substring-removal/index.html echo ${url:8:10} #liming.pub

替换

  • 首次匹配并替换${var/Pattern/Replacement}
  • 全部匹配并替换${var//Pattern/Replacement}
  • 全部匹配并删除${var//Pattern},由于Replacement没有,默认会认为是空字符串:
1
2
3
echo ${url/-/_}  #https://liming.pub/post/shell_substring-removal/index.html
echo ${url//-/_} #https://liming.pub/post/shell_substring_removal/index.html
echo ${url//-}   #https://liming.pub/post/shellsubstringremoval/index.html

要点

  • 前后:键盘上#在左,%在右,所以#为左删除,%为右删除;
  • 大小:一个字符为小,两个字符为大,所以#为最小匹配,##为最大匹配。

参考