免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4861 | 回复: 3
打印 上一主题 下一主题

[文本处理] 字符串截取 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-27 14:59 |只看该作者 |倒序浏览
今天工作事情不多,在看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}就好了,这个样子看起来比较挫,有什么更好的办法么?

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
2 [报告]
发表于 2013-08-27 15:44 |只看该作者
ABS第120页

Advanced Bash-Scripting Guide 3.9.1 中文版.pdf
http://bbs.chinaunix.net/thread-1610033-1-1.html

论坛徽章:
0
3 [报告]
发表于 2013-08-27 15:47 |只看该作者
回复 2# Shell_HAT


谢谢。

论坛徽章:
0
4 [报告]
发表于 2013-08-28 01:20 |只看该作者
回复 1# hitcoolcat


    已经够好的了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP