- 论坛徽章:
- 0
|
今天工作事情不多,在看shell方面的一些东西,刚好看到字符串截取,就发一下我整理的内容,我觉得整理的没有问题,大家看看如果有错误,还望赐教。
${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
这些是看到别人写的,我只是copy下来了。
下面是我在自己环境上做到一些测试
例子:
x=abaacaadaefg
echo ${x%%aa*}
从右边开始截取,要截取包含aa的最长的字段,结果是ab
echo ${x%aa*}
从右边开始截取,要截取包含aa的最短的字段,结果是abaac
echo ${x%a*}
从右边开始截取,要截取包含a的最短的字段,结果是abaacaad
上面例子里面最后的 *是有意义的,这个星号的意思是说我要匹配的aa或者a后面可以有其他字符,也可以没有。假如上面三个例子里面都去掉最后的*,那么意思就变成了,从右边开始匹配,找到有aa或者a,将其截掉,那么这个串最右边是g,明显不会是aa或者a,所以如果上面的三个例子如果去掉最后的*,那么实际上是什么也截不掉,原串返回,这里面可能有疑问,例如echo ${x%%aa},意思不是说从右边开始找,找到有aa的然后尽量长的截掉,那么不应该给我返回ab么?但是注意如果你希望返回ab,那么要截掉的串是aacaadaefg,所以不是echo ${x%%aa},而是echo ${x%%aa*}
echo ${x#a*}
从左边开始截取,要截取包括a的最短的字段,结果是baacaadaefg
echo ${x#*a}
这个和上面的返回结果是一样的
上面两个例子,无论是a*还是*a都是一样的,但是如果不是截取最短(#),而是截取最长(##),那么就不同了,例如:
echo ${x##*a} 返回是efg
echo ${x##a*} 这就会把整个串都截掉了,没有了
echo ${x##*aa} 返回daefg
echo ${x##aa*} 返回原串,什么都截不掉
助记方式,在键盘上#在$的左边,%在$的右边,所以#就是从左边开始截取,而$就是从右边开始截取,而只用一个就代表截取短的,用两个就代表截取长的。
后来我在想一个问题,对于串x=abaacaadaaefg,我想要获得的结果是daaefg,我一开始想,现在我只能选择截取最短或者最长,那我没办法匹配到第二次的aa,所以一开始我很笨的做法是先从右边截取一次:${x#*aa},然后将这个结果赋值给一个变量,然后对那个变量在做一次一样的截取,后来,我发现哪里这么麻烦,直接echo ${x#*aa*aa}就好了,这个样子看起来比较挫,有什么更好的办法么? |
|