Linux 字符串操作

开关正则识别

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为数组
  1. 使用分隔符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
  1. 如果字符串中没有空格,可以把分隔符替换成空格,就可以不用转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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值