首页 理论教育 实用LinuxShell编程:Bash字符串操作指南

实用LinuxShell编程:Bash字符串操作指南

时间:2023-11-18 理论教育 版权反馈
【摘要】:Linux下的常用工具awk与sed可以做与字符串相关的很多操作。Bash内置了一些字符串的操作功能,使用内置操作可以省掉启动外部程序的时间,速度会更快,见表4-5。实际工作中,几乎都使用basename和dirname这一对命令来得到文件名和文件的路径,顺便在这里介绍一下它们。例如:表4-5的其他操作用在数组上的话,就是对每个数组元素进行同样的处理。

实用LinuxShell编程:Bash字符串操作指南

Linux下的常用工具awk与sed可以做与字符串相关的很多操作。Bash内置了一些字符串的操作功能,使用内置操作可以省掉启动外部程序的时间,速度会更快,见表4-5。

表4-5 字符串操作

978-7-111-48202-4-Chapter04-205.jpg

例如,看看morning这个字符串的长度

978-7-111-48202-4-Chapter04-206.jpg

从morning这个字符串的第0个字符开始取子字符串,就是它本身:

978-7-111-48202-4-Chapter04-207.jpg

978-7-111-48202-4-Chapter04-208.jpg

分别从第1个字符和第5个字符开始取子字符串:

978-7-111-48202-4-Chapter04-209.jpg

从第2个字符开始取长度为3的子字符串:

978-7-111-48202-4-Chapter04-210.jpg

表4-5中的regexp是一个正则表达式,而不是普通的字符串,看下面的例子就明白了。

*代表零个或者多个字符,对于字符串morning而言,m*n可以匹配morn,也可以匹配mornin。从字符串morning的开头,删除最短匹配m*n的子串,也就是删除morn,得到ing:

978-7-111-48202-4-Chapter04-211.jpg

从字符串morning的开头,删除最长匹配m*n的子串,也就是删除mornin,得到g:

978-7-111-48202-4-Chapter04-212.jpg

从字符串morning的结尾,删除最短匹配n*g的子串,也就是删除ng,得到morni:

978-7-111-48202-4-Chapter04-213.jpg

从字符串morning的结尾,删除最长匹配n*g的子串,也就是删除ning,得到mor:

978-7-111-48202-4-Chapter04-214.jpg

由上可知,井号(#)“控制着”字符串的开头(左边),百分号(%)“控制着”字符串的尾部(右边)。这不太容易记住,有时候会记反。这里提供一种记忆方法:#看上去像两个+错开放在一起,数的正号负号都是放在开头,如,+78;而写百分比时,%都是放在结尾,如,96%。或者看看键盘,#键在左边,%键在#的右边。

下面介绍#和%的应用,看一个“掐头去尾”的例子。已知一个文件的全路径,如,/usr/bin/zip,如果只想知道文件名zip本身,从头开始匹配,*/最长可以匹配/usr/bin/(其中,*匹配/usr/bin,/匹配bin后边的斜杠),“掐头”后,剩下zip:

978-7-111-48202-4-Chapter04-215.jpg(www.xing528.com)

如果只想知道文件的路径,从后面开始匹配,/*最短可以匹配/zip(其中,/匹配zip前面的斜杠,*匹配zip),“去尾”后,剩下/usr/bin:

978-7-111-48202-4-Chapter04-216.jpg

上面的“掐头去尾”只是例子。实际工作中,几乎都使用basename和dirname这一对命令来得到文件名和文件的路径,顺便在这里介绍一下它们。命令basename的输入参数为一个带路径的文件时,输出为文件名本身,如:

978-7-111-48202-4-Chapter04-217.jpg

命令dirname的输入参数为一个带路径的文件时,输出为其路径,如:

978-7-111-48202-4-Chapter04-218.jpg

下面介绍表4-5中最后四行的内容。

给str重新赋值,mo重复了三次:

978-7-111-48202-4-Chapter04-219.jpg

把第一个mo替换为xyz:

978-7-111-48202-4-Chapter04-220.jpg

把所有的mo替换为xyz:

978-7-111-48202-4-Chapter04-221.jpg

m*i匹配momomorni,把字符串前面的匹配m*i的部分替换为xyz:

978-7-111-48202-4-Chapter04-222.jpg

i*g匹配ing,把尾部的匹配i*g的部分替换为xyz:

978-7-111-48202-4-Chapter04-223.jpg

因为mo不在字符串momomorning的尾部,所以下面的操作不能做任何替换,得到的字符串与原字符串相同:

978-7-111-48202-4-Chapter04-224.jpg

表4-5的前三行不仅适用于单个变量,也适用于数组。例如:

978-7-111-48202-4-Chapter04-225.jpg

表4-5的其他操作用在数组上的话,就是对每个数组元素进行同样的处理。例如:

978-7-111-48202-4-Chapter04-226.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈