演示

Shell 截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取。

从指定位置开始截取

这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。

既然需要指定起始位置,那么就涉及到计数方向的问题,到底是从字符串左边开始计数,还是从字符串右边开始计数。答案是 Shell 同时支持两种计数方式。

1) 从字符串左边开始计数

如果想从字符串的左边开始计数,那么截取字符串的具体格式如下:

${string: start :length}

其中,string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾)。

例如:

url="c.biancheng.net"
echo ${url: 2: 9}

结果为

biancheng

再如:

url="c.biancheng.net"
echo ${url: 2}  #省略 length,截取到字符串末尾

结果为

biancheng.net

2) 从右边开始计数

如果想从字符串的右边开始计数,那么截取字符串的具体格式如下:

${string: 0-start :length}

同第 1) 种格式相比,第 2) 种格式仅仅多了

0-

,这是固定的写法,专门用来表示从字符串右边开始计数。

这里需要强调两点:

  • 从左边开始计数时,起始数字是 0(这符合程序员思维);从右边开始计数时,起始数字是 1(这符合常人思维)。计数方向不同,起始数字也不同。
  • 不管从哪边开始计数,截取方向都是从左到右。

例如:

url="c.biancheng.net"
echo ${url: 0-13: 9}

结果为

biancheng

。从右边数,

b

是第 13 个字符。

再如:

url="c.biancheng.net"
echo ${url: 0-13}  #省略 length,直接截取到字符串末尾

结果为

biancheng.net

从指定字符(子字符串)开始截取

这种截取方式无法指定字符串长度,只能从指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。

1) 使用 # 号截取右边字符

使用

#

号可以截取指定字符(或者子字符串)右边的所有字符,具体格式如下:

${string#*chars}

其中,string 表示要截取的字符,chars 是指定的字符(或者子字符串),

*

是通配符的一种,表示任意长度的字符串。

*chars

连起来使用的意思是:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。

请看下面的例子:

从:开始截取右边所有字符,不含:

url="http://c.biancheng.net/index.html"
echo ${url#*:}

结果为

//c.biancheng.net/index.html

以下写法也可以得到同样的结果:

echo ${url#*p:}echo ${url#*ttp:}

如果不需要忽略 chars 左边的字符,那么也可以不写

*

,例如:

url="http://c.biancheng.net/index.html"
echo ${url#http://}

结果为

c.biancheng.net/index.html

注意,以上写法遇到第一个匹配的字符(子字符串)就结束了。例如:

url="http://c.biancheng.net/index.html"
echo ${url#*/}

结果为

/c.biancheng.net/index.html

。url 字符串中有三个

/

,输出结果表明,Shell 遇到第一个

/

就匹配结束了。

如果希望直到最后一个指定字符(子字符串)再匹配结束,那么可以使用

##

,具体格式为:

${string##*chars}

请看下面的例子:

#!/bin/bash
url="http://c.biancheng.net/index.html"
echo ${url#*/}    #结果为 /c.biancheng.net/index.html
echo ${url##*/}   #结果为 index.html
str="---aa+++aa@@@"
echo ${str#*aa}   #结果为 +++aa@@@
echo ${str##*aa}  #结果为 @@@

2) 使用 % 截取左边字符

使用

%

号可以截取指定字符(或者子字符串)左边的所有字符,具体格式如下:

${string%chars*}

请注意

*

的位置,因为要截取 chars 左边的字符,而忽略 chars 右边的字符,所以

*

应该位于 chars 的右侧。其他方面

%

#

的用法相同,这里不再赘述,仅举例说明:

#!/bin/bash
url="http://c.biancheng.net/index.html"
echo ${url%/*}  #结果为 http://c.biancheng.net
echo ${url%%/*}  #结果为 http:
str="---aa+++aa@@@"
echo ${str%aa*}  #结果为 ---aa+++
echo ${str%%aa*}  #结果为 ---

汇总

最后,我们对以上 8 种格式做一个汇总,请看下表:

格式 说明
${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。
${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
${string: 0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后。
${string#*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string##*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string%chars*} 从 string 字符串第一次出现 chars* 的位置开始,截取 chars* 左边的所有字符。
${string%%chars*} 从 string 字符串最后一次出现 chars* 的位置开始,截取 chars* 左边的所有字符。

参考链接:

http://c.biancheng.net/view/1120.html

Linux Shell字符串截取(非常详细):#左边开始截取、%右边开始截取、指定位置截取相关推荐

  1. linux shell 字符串操作(长度,查找,替换)详解 BASH

    linux shell 字符串操作(长度,查找,替换)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系 ...

  2. linux shell字符串及字符串长度获取方式

    linux shell字符串及字符串长度获取方式

  3. 在 Linux shell 字符串中,百分比符号是什么?

    当你正在学习如何完全使用 Linux shell 时,你可以能会觉得自己能够对字符串进行操作. 记住,今天q&一个文章的超级用户对读者的一个奇怪问题有答案. 今天,回答会话的问题来自超级用户的 ...

  4. linux全局查找字符串,Linux系统字符串查找命令详细说明

    Linux系统中有时候需要特定的查找字符串的功能.下面由学习啦小编为大家整理了Linux系统字符串查找命令详细说明,希望对大家有帮助! Linux系统字符串查找命令详细说明 1.作用 Linux系统中 ...

  5. linux shell字符串截取总结

    一.字符串变量的截取操作 对字符串变量的截取操作一般都是通过${操作符}的方式进行,如下: 1.从指定位置(index)截取固定长度 格式:${string:start:length} 其中,stri ...

  6. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  7. Linux shell脚本基础学习详细介绍(完整版)

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  8. linux shell 字符串作变量名 间接变量引用

    方法一 #!/bin/bash name=yushuang var=name # 要获取到yushuang res=`eval echo '$'"$var"` echo $res ...

  9. Linux shell脚本基础学习详细介绍(完整版)2

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

最新文章

  1. 美国已批准马斯克的SpaceX发射1.2万颗卫星 以打造一个天基互联网
  2. 服务发现与负载均衡traefik ingress
  3. 设计模式学习01-策略模式
  4. java都要caps标点_Java Button.setAllCaps方法代码示例
  5. 洛谷——P1001 A+B Problem
  6. M1: 复制带随机指针的链表
  7. linux删除win分区工具,Win 10 和 Linux 双系统,从硬盘删除Linux分区,Win 10引导修复...
  8. 2021年安全员-C证(安徽省)考试试卷及安全员-C证(安徽省)试题及解析
  9. QT实现简单的抽奖界面
  10. 什么是MXF文件?将MXF转为MP4格式的方法
  11. HenCoder自定义View学习整理
  12. 计算机考研408难吗?学到什么程度才能考130?
  13. 高产攻关保全年粮丰 国稻种芯·中国水稻节:广西多措并举
  14. java 线程池超时_Java定时线程池停止超时任务
  15. GitHub进行版本回退
  16. AMAX 深度学习服务器重装系统
  17. FTP使用教程之Filezilla使用教程
  18. configure: error: C++ preprocessor /lib/cpp fails sanity check
  19. linux口令长度,linux的口令复杂度
  20. 怎么判断一个数字是否是快乐数

热门文章

  1. BorlandC汉字库 HZK像素字模
  2. cname解析教程_域名cname怎么解析 域名cname解析设置方法
  3. texstudio与ctex_Latex的使用(Ctex+TeXstudio)
  4. 推动门html5,白鹭引擎CEO陈书艺:推动游戏前行 开启HTML5游戏之门
  5. linux求数组的交集,shell/bash 交集、并集、差集
  6. 13个很酷但很少有人知道的HTML元素
  7. 自定义 remoteView
  8. ubuntu vim中文显示乱码
  9. Java动态数据生成PDF文档及下载
  10. java程序员二级_Java程序员认证模拟题及详细分析(2)