shell中常用的变量处理、字符串操作(之二)
参考:http://www.zsythink.net/archives/2296
上一篇文章中,我们提到了shell中常用的字符串处理操作,我们来回顾一下
一、获取变量的长度(字符串长度)。
二、对变量值进行截取(截取字符串)。
三、替换变量值中的某段字符。
四、删除变量值中的某段字符。
五、对变量值进行大小写转换。
六、当变量值为空时,对变量进行一些操作。
上篇文章中,我们已经总结了怎样获取变量长度,以及怎样对变量值进行截取,这篇文章中我们就来总结一下,怎样删除变量值中的字符串,以及怎样替换变量值中的字符串。
替换变量中的字符串
假如,我们想要把字符串"www.zsythink.net"中的"www"替换成"linux",我们该怎么办呢?方法有很多种,不过此处,我们是来讨论操作变量的方法的,所以我们不考虑其他方法,我们来看一个替换变量中字符的示例,示例如下
1 2 3 4 5 | [root@node1 ~]# website= "www.zsythink.net" [root@node1 ~]# echo ${website} www.zsythink.net [root@node1 ~]# echo ${website/www/linux} linux.zsythink.net |
上例表示,将website变量中的www替换成linux,就是这么简单,但是需要注意,上例中的写法,只能替换字符串中第一个遇到的"www",如果字符串中包含多个"www",只有第一个"www"会被替换,其他"www"不会被替换,示例如下
[root@node1 ~]# teststr="www.abc.www.def" [root@node1 ~]# echo ${teststr} www.abc.www.def [root@node1 ~]# echo ${teststr/www/linux} linux.abc.www.def [root@node1 ~]#
如果我们想要将字符串中的所有www都替换成linux,则可以使用如下语法,示例如下
[root@node1 ~]# teststr="www.abc.www.def" [root@node1 ~]# echo ${teststr} www.abc.www.def [root@node1 ~]# echo ${teststr/www/linux} linux.abc.www.def [root@node1 ~]# echo ${teststr//www/linux} linux.abc.linux.def [root@node1 ~]#
除了上述两种方法能够替换变量中的字符串,其实还有两种方法,不过这两种方法针对性比较强,一种是针对行首的字符串进行替换,另一种是针对行尾的字符串进行替换,示例如下
[root@node1 ~]# teststr="www.def.www" [root@node1 ~]# echo ${teststr/#www/linux} linux.def.www [root@node1 ~]# echo ${teststr/%www/linux} www.def.linux [root@node1 ~]#
没错,上图中的两个例子分别表示只替换行首的www,或者只替换行尾的www
删除变量中的字符串
只要理解了怎样替换变量中的字符串,再来理解怎样删除变量中的字符串,简直不要太简单,因为它们的语法几乎是一样。
假如,我们想要将字符串"www.zsythink.net"中的第一个"."替换成"@" ,可以使用如下语法
[root@node1 ~]# echo ${website} www.zsythink.net [root@node1 ~]# echo ${website/./@} www@zsythink.net [root@node1 ~]#
刚才说过,删除字符串的语法比替换字符串的语法更简单,如果我们想要删除上述字符串中的第一个"." 则可以使用如下方法
1 2 3 | [root@node1 ~]# echo ${website/.} wwwzsythink.net [root@node1 ~]# |
其实就是把替换部分省略了,下面是替换部分使用空白代替
1 2 3 | [root@node1 ~]# echo ${website/./} wwwzsythink.net [root@node1 ~]# |
同理,在删除字符串也有多种方法。
比如,刚才的示例中,我们只删除了字符串中的第一个"." ,如果我们想要删除字符串中的所有的"." ,则可以使用如下语法
1 2 3 | [root@node1 ~]# echo ${website //.} wwwzsythinknet [root@node1 ~]# |
聪明如你一定发现了,其实,删除字符串的语法是与替换字符串的语法其实是"对应的"。
那么综上所述,你应该已经可以推理出另外两种删除字符串的方法了。
没错,删除行首的某个字符串或者删除行尾的某个字符串的方法如下
1 2 3 4 5 6 | [root@node1 ~]# teststr= "www.abc.def.www" [root@node1 ~]# echo ${teststr/#www} .abc.def.www [root@node1 ~]# echo ${teststr/%www} www.abc.def. [root@node1 ~]# |
小结
删除字符串操作
删除变量值中第一个遇到的指定字符串
语法:echo ${var/str}
1 2 3 4 | #下例表示删除变量值中第一个遇到的"@" # teststr="zsy@think@linux" # echo ${teststr/@} zsythink@linux |
删除变量值中所有的指定字符串
语法:echo ${var//str}
1 2 3 4 | #下例表示删除字符串中所有的"@" # teststr="zsy@think@linux" # echo ${teststr//@} zsythinklinux |
特殊情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 刚才总结了两种语法 语法一:删除变量值中所有的指定字符串的语法为echo ${ var //str} 语法二:删除变量值中第一个遇到的指定字符串的语法为echo ${ var /str} 如果,我们要删除字符串 "/usr/local/chroot/usr/local" 中第一个遇到的 "/usr" ,该怎么办呢? 正常情况下,我们会套用上述语法二,将语法二中的 "str" 更改为 "/usr" ,套用语法二后的命令如下 # teststr="/usr/local/chroot/usr/local/nginx" # echo ${teststr//usr} 但是,套用语法二后的命令正好与上述语法一的语法结构相同,所以,本意是删除字符串中第一个遇到的 "/usr" ,但是最终结果却变为删除字符串中所有的 "usr" ,执行结果如下 # teststr="/usr/local/chroot/usr/local/nginx" # echo ${teststr//usr} //local/chroot//local/nginx 聪明如你一定想到了,这种情况需要对 "/" 进行转义,示例如下 # teststr="/usr/local/chroot/usr/local/nginx" # echo ${teststr/\/usr} /local/chroot/usr/local/nginx |
删除变量值中位于行首的指定字符串
语法:echo ${var/#str}
1 2 3 4 5 6 7 8 9 | #下例表示删除字符串中行首的"H" # teststr="H.H.H.H.H.H" # echo ${teststr/#H} .H.H.H.H.H #下例表示删除字符串中行首的"#" # teststr="#zsy#think#linux" # echo ${teststr/##} zsy#think#linux |
特殊情况
1 2 3 4 | 参考之前的特殊情况,即可发现,由于删除字符串中行首的字符时需要使用语法 "/#" ,所以如果想要删除字符串中第一个遇到的 "#" 时,则不能使用 "/#" ,需要对 "#" 进行转义,示例如下,删除字符串中第一个遇到的 "#" # teststr="zsy#think#linux" # echo ${teststr/\#} zsythink#linux |
删除变量值中位于行尾的指定字符串
语法:echo ${var/%str}
1 2 3 4 5 6 7 8 9 | #下例表示删除字符串中行尾的"H" # teststr="H.H.H.H.H.H" # echo ${teststr/%H} H.H.H.H.H. #下例表示删除字符串中行尾的"%" # teststr="zsy%think%linux%" # echo ${teststr/%%} zsy%think%linux |
特殊情况
1 2 3 4 5 | 参考之前的特殊情况,即可发现,由于删除字符串中行尾的字符时需要使用语法 "/%" ,所以如果想要删除字符串中第一个遇到的 "%" 时,则不能使用 "/%" ,需要对 "%" 进行转义 #示例如下,删除字符串中第一个遇到的"%" # teststr="zsy%think%linux%" # echo ${teststr/\%} zsythink%linux% |
替换字符串操作
将变量值中第一个遇到的str1替换成str2
语法:echo ${var/str1/str2}
1 2 3 4 | #下例表示将字符串中第一个遇到的"w"替换成"abc" # teststr="www" # echo ${teststr/w/abc} abcww |
将变量值中所有的str1替换成str2
语法:echo ${var//str1/str2}
1 2 3 4 | #下例表示将字符串中所有"w"替换成"abc" # teststr="www" # echo ${teststr//w/abc} abcabcabc |
将变量值中位于行首的str1替换成str2
语法:echo ${var/#str1/str2}
1 2 3 4 | #下例表示将字符串中位于行首的abc替换成123 # teststr="abcdefabc666abc888abc" # echo ${teststr/#abc/123} 123defabc666abc888abc |
将变量值中位于行尾的str1替换成str2
语法:echo ${var/%str1/str2}
1 2 3 4 | #下例表示将字符串中位于行尾的abc替换成666 # teststr="abcdefabc666abc888abc" # echo ${teststr/%abc/666} abcdefabc666abc888666 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2019-09-23 Linux之date命令详解