前沿
在编写shell脚本的时候,很多情况下,我们都会遇到截取字符串的一部分这种需求。由于不同的原始字符串差距较大,导致解决这个的方法也分不同的情况。
所以这篇文章不可能一次性的全部写完,我会边写边改,也会不停的升级更新。
知道关键字进行截取
第一种情况是字符串只有一行,且这一行的内容没有什么特殊的分隔符,比如每个字段之间用空格分开。
也就是说这是一串乱码字符串,我们需要在这串乱码字符串中截取某一个关键字之前或者之后的内容。
// 下面的varible表示的是需要处理的字符串变量
// string是需要在变量中搜索匹配的字符串
// “*”是一个通配符,位置按照下面的配置即可
${varible#*string} // 从左向右截取第一个string后的字符串
${varible##*string} // 从左向右截取最后一个string后的字符串
${varible%%string*} // 从右向左截取最后一个string后的字符串
${varible%string*} // 从右向左截取第一个string后的字符串
通过观察上面的描述,想必大家都清楚怎么使用了吧:
- 从左往右,用井号操作符;
- 从左往右,通配符在字符串左边;
- 从右往左,用百分号操作符;
- 从右往左,通配符在字符串的右边;
- 从第一个查找,用一个操作符;
- 从最后一个查找,用两个操作符;
下面进行举例说明:
先假设我需要处理的字符串是MyVar。
MyVar=Test1Test2Test3LuanMaTest2Test3.Test4 // 定义变量MyVar
echo $MyVar // 将MyVar这个变量打印出来
//得到的结果是: Test1Test2Test3LuanMaTest2Test3.Test4
echo ${MyVar#*Test2}
//得到的结果是: Test3LuanMaTest2Test3.Test4
echo ${MyVar##*Test2}
//得到的结果是: Test3.Test4
echo ${MyVar%Test2*}
//得到的结果是: Test1Test2Test3LuanMa
echo ${MyVar%%Test2*}
//得到的结果是: Test1
知道字符串的具体位置进行截取
假设我们需要从原来字符串中截取一个固定位置的子字符串,那么可以用类似于编程语言中的索引进行截取。
${varible:n1:n2} ## 截取变量varible从n1开始的n2个字符,组成一个子字符串。
## 注意是n1开始,然后是截取n2个字符,并不是截取到n2的位置
## 继续以上面的$MyVar 为例进行说明
echo ${MyVar:5:10}
##得到的结果是: Test2Test3
以上两种方式都针对的是简单的字符串,也就是一行乱码字符串的情况下,进行处理。
其余的待续。