Shell字符串操作大全

时间:2022-01-23 21:01:44

1.字符串声明

一般字符串声明时,都会赋值

str='test'

但是在脚本运行中,为了避免出现引用为声明的字符串变量时,可以在如下处理:

#如果str没声明,则输出DEFAULT
echo "${str=DEFAULT}"

#DEFAULT

2.字符串长度

str=‘abc,def,ghi,abcjkl’
#字符串长度
echo ${#str}


3.字符串截取

从位置position开始截取字符串

格式: ${str:position}

#从第5个元素开始截取
echo ${str:5}

#ef,ghi,abcjkl

从start开始,截取长度为length的字符串
格式:${str:start:length}
echo ${str:5:8}

#ef,ghi,a

从str开头开始删除substring匹配
格式:${str#substring}或${str##substring}
str="abc,def,ghi,abcjkl"
#从str开头开始删除最短的a*c匹配
echo ${str#a*c}

#,def,ghi,abcjkl

#从str开头开始删除最长的a*c匹配
echo ${str##a*c}

#jkl

从str结尾开始删除substring匹配
格式:${str%substring}或${str%%substring}
#从str结尾开始删除最短的b*l匹配
echo ${str%b*l}

#abc,def,ghi,a

#从str结尾开始删除最长的b*l匹配
echo ${str%%b*l}

#a

4.字符串替换

用replace替换字符串中第一个substring
格式:${str/substring/replace}或者${str//substring/replace}
#用TEST替换字符串中第一个abc
echo ${str/abc/TEST}

#TEST,def,ghi,abcjkl

#用TEST替换字符串中所有的abc
echo ${str//abc/TEST}

#TEST,def,ghi,TESTjkl

#从str开头匹配,用TEST替换最长的a*c
echo ${str/#a*c/TEST}

#TESTjkl

#从str结尾匹配,用TEST替换最长的b*l
echo ${str/%b*l/TEST}

#aTEST

5.expr操作字符串

对于上面的一些操作,如果改用expr执行,那么就很简单了:
str='2016-01-05'
#求字符串长度
length=`expr length $str`
echo $length

#10

#截取字符串
substr=`expr substr $str 1 4`
echo $substr

#2016

#求字符串中元素的下标索引,如果元素不存在输出0(因为此时索引从1开始)
index=`expr index $str "2"`
echo $index

#1
 

6.split字符串

一般截取字符串还可以用cut和awk,如:
str='2016-01-05'
echo $str | awk -F '-' '{print $1}'
echo $str|awk '{print substr($str,1,4)}'
echo $str | awk -F '-' '{for( i=1;i<=NF; i++ ) print $i}'


#2016
#2016
#2016
#01
#05

但是,不建议采用这种方式,因为当文件很大,有很多行,上述方式需要开辟管道,会启动新进程,效率很低下。同时,如果要把awk结果存在数组时,就还需要一个for循环才行。
因此,建议采用下面这种方式:
arr=(${str//-/ })
echo ${arr[1]}

#01


把split结果存到数组中后,剩下的就是对数组的操作,如果对Shell数组不熟,那么可以参考 Shell数组

Shell字符串操作、Shell数组熟悉之后就可以用Shell进行小文件处理。