Linux Shell字符串截取(非常详细):#左边开始截取、%右边开始截取、指定位置截取
演示
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字符串截取(非常详细):#左边开始截取、%右边开始截取、指定位置截取相关推荐
- linux shell 字符串操作(长度,查找,替换)详解 BASH
linux shell 字符串操作(长度,查找,替换)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系 ...
- linux shell字符串及字符串长度获取方式
linux shell字符串及字符串长度获取方式
- 在 Linux shell 字符串中,百分比符号是什么?
当你正在学习如何完全使用 Linux shell 时,你可以能会觉得自己能够对字符串进行操作. 记住,今天q&一个文章的超级用户对读者的一个奇怪问题有答案. 今天,回答会话的问题来自超级用户的 ...
- linux全局查找字符串,Linux系统字符串查找命令详细说明
Linux系统中有时候需要特定的查找字符串的功能.下面由学习啦小编为大家整理了Linux系统字符串查找命令详细说明,希望对大家有帮助! Linux系统字符串查找命令详细说明 1.作用 Linux系统中 ...
- linux shell字符串截取总结
一.字符串变量的截取操作 对字符串变量的截取操作一般都是通过${操作符}的方式进行,如下: 1.从指定位置(index)截取固定长度 格式:${string:start:length} 其中,stri ...
- Linux shell脚本基础学习详细介绍(完整版)一
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...
- Linux shell脚本基础学习详细介绍(完整版)
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...
- linux shell 字符串作变量名 间接变量引用
方法一 #!/bin/bash name=yushuang var=name # 要获取到yushuang res=`eval echo '$'"$var"` echo $res ...
- Linux shell脚本基础学习详细介绍(完整版)2
详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...
最新文章
- 美国已批准马斯克的SpaceX发射1.2万颗卫星 以打造一个天基互联网
- 服务发现与负载均衡traefik ingress
- 设计模式学习01-策略模式
- java都要caps标点_Java Button.setAllCaps方法代码示例
- 洛谷——P1001 A+B Problem
- M1: 复制带随机指针的链表
- linux删除win分区工具,Win 10 和 Linux 双系统,从硬盘删除Linux分区,Win 10引导修复...
- 2021年安全员-C证(安徽省)考试试卷及安全员-C证(安徽省)试题及解析
- QT实现简单的抽奖界面
- 什么是MXF文件?将MXF转为MP4格式的方法
- HenCoder自定义View学习整理
- 计算机考研408难吗?学到什么程度才能考130?
- 高产攻关保全年粮丰 国稻种芯·中国水稻节:广西多措并举
- java 线程池超时_Java定时线程池停止超时任务
- GitHub进行版本回退
- AMAX 深度学习服务器重装系统
- FTP使用教程之Filezilla使用教程
- configure: error: C++ preprocessor /lib/cpp fails sanity check
- linux口令长度,linux的口令复杂度
- 怎么判断一个数字是否是快乐数
热门文章
- BorlandC汉字库 HZK像素字模
- cname解析教程_域名cname怎么解析 域名cname解析设置方法
- texstudio与ctex_Latex的使用(Ctex+TeXstudio)
- 推动门html5,白鹭引擎CEO陈书艺:推动游戏前行 开启HTML5游戏之门
- linux求数组的交集,shell/bash 交集、并集、差集
- 13个很酷但很少有人知道的HTML元素
- 自定义 remoteView
- ubuntu vim中文显示乱码
- Java动态数据生成PDF文档及下载
- java程序员二级_Java程序员认证模拟题及详细分析(2)