shell两个时间字符串插值_shell中常用的变量处理、字符串操作(之二)

上一篇文章中,我们提到了shell中常用的字符串处理操作,我们来回顾一下

一、获取变量的长度(字符串长度)。

二、对变量值进行截取(截取字符串)。

三、替换变量值中的某段字符。

四、删除变量值中的某段字符。

五、对变量值进行大小写转换。

六、当变量值为空时,对变量进行一些操作。

上篇文章中,我们已经总结了怎样获取变量长度,以及怎样对变量值进行截取,这篇文章中我们就来总结一下,怎样删除变量值中的字符串,以及怎样替换变量值中的字符串。

替换变量中的字符串

假如,我们想要把字符串"www.zsythink.net"中的"www"替换成"linux",我们该怎么办呢?方法有很多种,不过此处,我们是来讨论操作变量的方法的,所以我们不考虑其他方法,我们来看一个替换变量中字符的示例,示例如下

[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~]#

刚才说过,删除字符串的语法比替换字符串的语法更简单,如果我们想要删除上述字符串中的第一个"." 则可以使用如下方法

[root@node1 ~]# echo ${website/.}

wwwzsythink.net

[root@node1 ~]#

其实就是把替换部分省略了,下面是替换部分使用空白代替

[root@node1 ~]# echo ${website/./}

wwwzsythink.net

[root@node1 ~]#

同理,在删除字符串也有多种方法。

比如,刚才的示例中,我们只删除了字符串中的第一个"."  ,如果我们想要删除字符串中的所有的"." ,则可以使用如下语法

[root@node1 ~]# echo ${website//.}

wwwzsythinknet

[root@node1 ~]#

聪明如你一定发现了,其实,删除字符串的语法是与替换字符串的语法其实是"对应的"。

那么综上所述,你应该已经可以推理出另外两种删除字符串的方法了。

没错,删除行首的某个字符串或者删除行尾的某个字符串的方法如下

[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}

#下例表示删除变量值中第一个遇到的"@"

# teststr="zsy@think@linux"

# echo ${teststr/@}

zsythink@linux

删除变量值中所有的指定字符串

语法:echo ${var//str}

#下例表示删除字符串中所有的"@"

# teststr="zsy@think@linux"

# echo ${teststr//@}

zsythinklinux

特殊情况

刚才总结了两种语法

语法一:删除变量值中所有的指定字符串的语法为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}

#下例表示删除字符串中行首的"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

特殊情况

参考之前的特殊情况,即可发现,由于删除字符串中行首的字符时需要使用语法"/#",所以如果想要删除字符串中第一个遇到的"#"时,则不能使用"/#",需要对"#"进行转义,示例如下,删除字符串中第一个遇到的"#"

# teststr="zsy#think#linux"

# echo ${teststr/\#}

zsythink#linux

删除变量值中位于行尾的指定字符串

语法:echo ${var/%str}

#下例表示删除字符串中行尾的"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

特殊情况

参考之前的特殊情况,即可发现,由于删除字符串中行尾的字符时需要使用语法"/%",所以如果想要删除字符串中第一个遇到的"%"时,则不能使用"/%",需要对"%"进行转义

#示例如下,删除字符串中第一个遇到的"%"

# teststr="zsy%think%linux%"

# echo ${teststr/\%}

zsythink%linux%

替换字符串操作

将变量值中第一个遇到的str1替换成str2

语法:echo ${var/str1/str2}

#下例表示将字符串中第一个遇到的"w"替换成"abc"

# teststr="www"

# echo ${teststr/w/abc}

abcww

将变量值中所有的str1替换成str2

语法:echo ${var//str1/str2}

#下例表示将字符串中所有"w"替换成"abc"

# teststr="www"

# echo ${teststr//w/abc}

abcabcabc

将变量值中位于行首的str1替换成str2

语法:echo ${var/#str1/str2}

#下例表示将字符串中位于行首的abc替换成123

# teststr="abcdefabc666abc888abc"

# echo ${teststr/#abc/123}

123defabc666abc888abc

将变量值中位于行尾的str1替换成str2

语法:echo ${var/%str1/str2}

#下例表示将字符串中位于行尾的abc替换成666

# teststr="abcdefabc666abc888abc"

# echo ${teststr/%abc/666}

abcdefabc666abc888666

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值