开关正则识别
shopt -s extglob #打开bash 识别正则
shopt -u extglob #关闭bash 识别正则
平时shell的通配符,只是通配语义,不是正则语义
加上这个 extglob 之后,才能是正则语义
语法格式是 +正则
开启之后,以下5个模式匹配操作符将被识别:
?(pattern-list) #所给模式匹配0次或1次
*(pattern-list) #所给模式匹配0次以上包括0次
+(pattern-list) #所给模式匹配1次以上包括1次
@(pattern-list) #所给模式仅仅匹配1次
!(pattern-list) #不匹配括号内的所给模式
字符串剪切
${varible#string}
从左向右删除非贪婪匹配string
的字符
${varible##string}
从左向右删除贪婪匹配string
的字符
例:
$var=linux/zat/shell/zbt/Users/zjt/bitbucket/z123t/python_utils
$echo ${var#linu} #匹配linu
x/zat/shell/zbt/Users/zjt/bitbucket/z123t/python_utils
$echo ${var#linux*t} #匹配linux/zat
/shell/zbt/Users/zjt/bitbucket/z123t/python_utils
$echo ${var#zjt} #开头不是zjt,没有匹配任何字符
linux/zat/shell/zbt/Users/zjt/bitbucket/z123t/python_utils
$echo ${var#linu*s} #匹配linux/zat/s
hell/zbt/Users/zjt/bitbucket/z123t/python_utils
$echo ${var##l*t} #贪婪匹配,匹配linux/zat/shell/zbt/Users/zjt/bitbucket/z123t/python_ut
ils
$echo ${var#z*t} #不以z开头,没有匹配任何字符
linux/zat/shell/zbt/Users/zjt/bitbucket/z123t/python_utils
$echo ${var#*z*t} #匹配linux/zat
/shell/zbt/Users/zjt/bitbucket/z123t/python_utils
$echo ${var##*z*t} #贪婪匹配,匹配linux/zat/shell/zbt/Users/zjt/bitbucket/z123t/python_ut
ils
$echo ${var#*/} #匹配linux/
zat/shell/zbt/Users/zjt/bitbucket/z123t/python_utils
$echo ${var##*/} #匹配linux/zat/shell/zbt/Users/zjt/bitbucket/z123t/
python_utils
$echo ${var##*/*} #匹配了整个字符串linux/zat/shell/zbt/Users/zjt/bitbucket/z123t/python_utils
$echo ${var#*z[0-9]*t} #匹配linux/zat/shell/zbt/Users/zjt/bitbucket/z123t
/python_utils
$echo ${var#*z[a-b]*t} #匹配linux/zat
/shell/zbt/Users/zjt/bitbucket/z123t/python_utils
$echo ${var#*z[b-c]*t} #匹配linux/zat/shell/zbt
/Users/zjt/bitbucket/z123t/python_utils
$echo ${var#*z[a-z0-9]*t} #linux/zat
/shell/zbt/Users/zjt/bitbucket/z123t/python_utils
${varible%string*}
从右向左删除非贪婪匹配string
的字符
${varible%%string*}
从右向左删除贪婪匹配string
的字符
例:
$var=linux/test/Users/zjt/bitbucket/zjt/python_utils
$echo ${var%zjt*}
linux/test/Users/zjt/bitbucket/
$echo ${var%/*}
linux/test/Users/zjt/bitbucket/zjt
$echo ${var%%zjt*}
linux/test/Users/
$echo ${var%%/*}
linux
${varible:m}
从m
个字符开始,截取到最后
${varible:m:n}
从m
个字符开始截取n
个字符
例:
$var=linux/test/Users/zjt/bitbucket/zjt/python_utils
$echo ${var:5}
/test/Users/zjt/bitbucket/zjt/python_utils
$echo ${var:5:11}
/test/Users
cut -d ${delim} -f ${index}
例:
$echo 'one_two_three_four_five' | cut -d '_' -f2
two
字符串替换
${varible/string/replace}
只替换第一个匹配的字符
${var//Pattern/Replacement}
替换所有匹配的字符
例:
$shopt -s extglob
$var=linux/zat/shell/zbt/Users/z456t/bitbucket/z123t/python_utils
$echo ${var/z+([0-9])t/abc}
linux/zat/shell/zbt/Users/abc/bitbucket/z123t/python_utils
$echo ${var//z+([0-9])t/abc}
linux/zat/shell/zbt/Users/abc/bitbucket/abc/python_utils
11:57:27|~$shopt -u extglob
字符串split为数组
- 使用分隔符IFS
例:
$var="a,b c,def,g"
$OLD_IFS=$IFS
$IFS=','
$array=(${var})
$IFS=$OLD_IFS
$echo ${#array[@]}
4
$echo ${array[*]}
a b c def g
$for i in ${array[@]};do echo $i; done
a
b c
def
g
- 如果字符串中没有空格,可以把分隔符替换成空格,就可以不用转IFS
例:
$var="a,bcd,efg,higkl,m,n"
$var_space=${var//,/ }
$echo $var_space
a bcd efg higkl m n
$array=($var_space)
$echo ${#array[@]}
6
$echo ${array[*]}
a bcd efg higkl m n
$echo ${array[@]}
a bcd efg higkl m n
$for i in ${array[*]};do echo $i; done
a
bcd
efg
higkl
m
n
$for key in ${!array[*]}; do echo "$key ${array[$key]}"; done
0 a
1 bcd
2 efg
3 higkl
4 m
5 n
参考:
https://www.tldp.org/LDP/abs/html/parameter-substitution.html
https://www.cnblogs.com/gaochsh/p/6901809.html