Shell技能树---字符串截取

  • 功能介绍

  字符串的截取是在一个长的字符串中提取其中一部分,解决从什么位置开始朝什么方向(通常向右)截取多大长度的子串问题。
例如: var="ABCDEF"; 从var的位置2(从0开始计数)开始截取长度为3的字符串,结果为"CDE"。

  • 语法格式

序号格式说明
1${string: start :length}从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
2${string: start}从 string 字符串的左边第 start 个字符开始截取,直到最后。
3${string: 0-start :length}从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
4${string: 0-start}从 string 字符串的右边第 start 个字符开始截取,直到最后。
5${string#*chars}

从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。

*chars表示匹配左边,功能理解为匹配删除掉,截取剩余的部分,所以右侧。

6${string##*chars}

从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。

两个##表示#贪婪,最大匹配

7${string%chars*}从 string 字符串第一次出现 *chars 的位置开始,截取 chars* 左边的所有字符。
8${string%%chars*}

从 string 字符串最后一次出现 *chars 的位置开始,截取 chars* 左边的所有字符。

两个%%表示%贪婪,最大匹配

备注:

  •   实例

1. ${string: start :length}

从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
start表示左侧开始第start个,start是从0开始计算。 length表示字符的个数。

renhl@verygood:~$ var="ABCDEF"; echo ${var:0:1} # 序号0 开始,长度1
A
renhl@verygood:~$ var="ABCDEF"; echo ${var:1:1} # 序号1 开始,长度1
B
renhl@verygood:~$ var="ABCDEF"; echo ${var:5:1} # 序号5 开始,长度1
F
renhl@verygood:~$ var="ABCDEF"; echo ${var:6:1} # 序号6 开始,长度1 超出字符串var长度

renhl@verygood:~$ var="ABCDEF"; echo ${var:0:2} # 序号0 开始,长度2
AB
renhl@verygood:~$ var="ABCDEF"; echo ${var:5:2} # 序号5 开始,长度2 长度2超出字符串var长度
F
renhl@verygood:~$
2. ${string: start}

从 string 字符串的左边第 start 个字符开始截取,直到最后。
start表示左侧开始第start个,start是从0开始计算。截取长度为右侧剩余的字符串的长度。

renhl@verygood:~$ var="ABCDEF"; echo ${var:0} # 序号0 长度序号右侧包含序号字符
ABCDEF
renhl@verygood:~$ var="ABCDEF"; echo ${var:1} # 序号1 长度序号右侧包含序号字符
BCDEF
renhl@verygood:~$ var="ABCDEF"; echo ${var:5} # 序号5 长度序号右侧包含序号字符
F
renhl@verygood:~$ var="ABCDEF"; echo ${var:6} # 序号6 长度序号右侧包含序号字符,序号var超出长度

renhl@verygood:~$
3. ${string: 0-start :length}

从 string 字符串的左边第 0-start 个字符开始,向右截取 length 个字符。
0-start表示右侧开始第start个,start是从1开始计算。 length表示字符的个数。

renhl@verygood:~$ var="ABCDEF"; echo ${var:0-1:1} #序号0-1,长度为1
F
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-2:1} #序号0-2,长度为1
E
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-6:1} #序号0-6,长度为1
A
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-7:1} #序号0-7,长度为1 超出范围

renhl@verygood:~$ var="ABCDEF"; echo ${var:0-2:2} #序号0-2,长度为2,取得右侧字符串
EF
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-3:2} #序号0-3,长度为2,取得右侧字符串
DE
renhl@verygood:~$
4. ${string: 0-start}

  从 string 字符串的右边第 start 个字符开始截取,直到最后。
0-start表示右侧开始第start个,start是从1开始计算。 截取长度为右侧剩余的字符串的长度。 

renhl@verygood:~$ var="ABCDEF"; echo ${var:0-1} # 序号0-1 长度序号右侧包含序号字符
F
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-5} # 序号0-5 长度序号右侧包含序号字符
BCDEF
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-6} # 序号0-6 长度序号右侧包含序号字符
ABCDEF
renhl@verygood:~$ var="ABCDEF"; echo ${var:0-7} # 序号0-7 由于-7超出序号范围,显示为空

renhl@verygood:~$
5. ${string#*chars}

从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。

*chars表示匹配左边,功能理解为匹配删除掉,截取剩余的部分,所以右侧。

renhl@verygood:~$ var="AB12CD12EF12GH"; echo ${var#*12} #左侧开始第一次出现12,截取12右侧所有字符
CD12EF12GH
6. ${string##*chars}

从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。

两个##表示#贪婪,最大匹配

renhl@verygood:~$ var="AB12CD12EF12GH"; echo ${var##*12} # 左侧开始搜索最后12的位置,截取位置右侧的字符串
GH
renhl@verygood:~$
7. ${string%chars*}

从 string 字符串第一次出现 *chars 的位置开始,截取 chars* 左边的所有字符。

renhl@verygood:~$ var="AB12CD12EF12GH"; echo ${var%12*} # 右侧开始搜索第一个12的位置,截取位置左侧的字符串
AB12CD12EF
8. ${string%%chars*}

从 string 字符串最后一次出现 *chars 的位置开始,截取 chars* 左边的所有字符。

两个%%表示%贪婪,最大匹配

renhl@verygood:~$ var="AB12CD12EF12GH"; echo ${var%%12*} # 右侧开始搜索最后一个12的位置,截取位置左侧的字符串
AB
renhl@verygood:~$

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值