shell下字符串的相关操作

本文详细介绍了如何使用Shell脚本进行字符串长度计算、匹配、索引、子串提取及替换等操作,并提供了具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算字符串长度:

[shentao@vps ~]$ string=abcABC123ABCabc
[shentao@vps ~]$ echo ${#string}
15
[shentao@vps ~]$ echo `expr length $string`
15
[shentao@vps ~]$ echo `expr "$string" : '.*'`
15
感觉最后一种是很奇怪的写法。

匹配字符串开头的长度:

[shentao@vps ~]$ echo `expr match "$string" 'abc'`
3
[shentao@vps ~]$ echo `expr match "$string" 'bc'`  #字符串不以bc开头
0
[shentao@vps ~]$ echo `expr match "$string" 'abc[A-Z]*.2'`
8
[shentao@vps ~]$ echo `expr match "$string" 'abc[A-Z]*2'`
0

索引:

$ echo `expr index "$string" C`
6
$ echo `expr index "$string" '5'`
0
$ echo `expr index "$string" '51'`
7
$ echo `expr index "$string" '5a1'`
1
后两个语句的结果值得注意。

提取子串:

$ echo ${string:0}
abcABC123ABCabc
$ echo ${string:5}
C123ABCabc
$ echo ${string:5:2}
C1
$ echo ${string:-5} # 这样写不能按期望输出
abcABC123ABCabc
$ echo ${string: -5} #要在负数前加个空格
BCabc
$ echo ${string: (-5)} #或者把负数括起来
BCabc
$ echo ${string: -5:2}
BC
$ echo ${string: (-5):2}
BC

第二种提取子串的方法:

$ echo `expr substr $string 4 3`
ABC


从字符串开头位置提取子串:

$  echo `expr match "$string" '\(.[b-c]*[A-Z]..[0-9]\)'`
abcABC1
$ echo `expr "$string" : '\(.[b-c]*[A-Z]..[0-9]\)'`
abcABC1

$ echo `expr "$string" : '\([b-c]*[A-Z]..[0-9]\)'`   #$string不以[b-c]*开头,所以不匹配



从字符串结尾位置开始提取子串:

$ echo `expr match "$string" '.*\([A-C][A-C][A-C][a-c]*\)'`
ABCabc
$  echo `expr "$string" : '.*\(......\)'`
ABCabc
$ echo `expr match "$string" '.*\([A-C][A-C][A-C][a-c]\)'`   # 从尾部开始提取,但并不是一定要提取最尾部的字符,下面两个例子说明这个
ABCa
$ echo `expr match "$string" '.*\([A-C][A-C][A-C]\)'`
ABC
$ echo `expr match "$string" '.*\([1-3][A-C][A-C][A-C]\)'`
3ABC


从字符串开头位置截取子串(把匹配的子串删除):

$ echo ${string#a*C}  #最短匹配
123ABCabc
$ echo ${string#b*C}  # 字符串不是以b开头,所以不匹配
abcABC123ABCabc
$ echo ${string##a*C}   #最长匹配
abc
$ echo ${string#b*C}  # 字符串不是以b开头,所以不匹配
abcABC123ABCabc



从字符串尾部截取子串:

$ echo ${string%b*c}
abcABC123ABCa
$ echo ${string%%b*c}
a
$ echo ${string%b*C}  #字符串不以C结尾,所以不匹配
abcABC123ABCabc
$ echo ${string%%b*C}  #同上
abcABC123ABCabc



替换字符串中的子串:

$ echo ${string/abc/mmm}  # 替换第一个找到的字符串
mmmABC123ABCabc
$ echo ${string//abc/mmm}   # 替换所有找到的字符串
mmmABC123ABCmmm
$ echo ${string//ac/mmm}  #没有ac,所以不替换
abcABC123ABCabc
指定替换开头或者结尾处的子串:

$ echo ${string/#abc/mmm}   #如果匹配字符串开头处的子串,就替换
mmmABC123ABCabc
$ echo ${string/%abc/mmm}   #如果匹配字符串结尾处的子串,就替换
abcABC123ABCmmm
$ echo ${string/#bc/mmm}   #字符串不以bc开头,所以不替换
abcABC123ABCabc
$ echo ${string/%ab/mmm}   #字符串不以ab结尾,所以不替换
abcABC123ABCabc






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值