首页 理论教育 LinuxShell编程中的字符串处理技巧

LinuxShell编程中的字符串处理技巧

时间:2023-11-18 理论教育 版权反馈
【摘要】:在字符串处理方面,expr也“有所作为”,见表4-6。表4-6 expr的字符串操作计算字符串的长度。所以,也可以用如下方式计算字符串长度:下面不是计算abcde%123的开头的小写字母串的长度,而是将小写字母串提取出来:还可以利用expr提取字符串的某部分内容。其中\.代表小数点本身,不再代表任意字符。从模式匹配的“规矩”可知,.*匹配了salary,\.匹配了salary.doc中的小数点,小括号中的.*匹配了doc。

LinuxShell编程中的字符串处理技巧

字符串处理方面,expr也“有所作为”,见表4-6。注意表中的最后两行,小括号前面有反斜杠。由于小括号在命令行里有特殊的含义(小括号里面的命令是在子shell里面执行,见3.11.8节),所以使用的时候前面要加反斜杠屏蔽其特殊的功能。

表4-6 expr的字符串操作

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

计算字符串的长度。例如,字符串Goodmorning的长度为12:

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

查询某字符在字符串中首次出现的位置,例如:

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

从某个字符串中取子串,例如,从“thisisabook”的第11个字符开始,取出4个字符:

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

表4-6中的regexp表示正则表达式。[a-z]表示任意一个小写字母,*表示匹配零次或者多次,那么[a-z]*可以匹配任意长度的小写字母串。字符串abcde%123的开头是长度为5的小写字母串:

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

“.”代表任意字符,.*可以与任意长度的字符串匹配。所以,也可以用如下方式计算字符串长度:

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

下面不是计算abcde%123的开头的小写字母串的长度,而是将小写字母串提取出来:(www.xing528.com)

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

还可以利用expr提取字符串的某部分内容。例如,有个文件的名字为salary.doc:

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

下面显示不带扩展名的文件名:

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

因为命令中正则表达式有小括号中的.*和.doc两部分,.doc匹配了文件名salary.doc的扩展名.doc,所以.*就只能匹配salary。模式匹配有一个“规矩”,就是“照顾全局”,同时也“兼顾局部”,让大家“都有份”。.*可以匹配任意长度的字符串,如果.*匹配了salary.doc,那么.doc就“没份”了,所以.*就匹配了salary。.*处在\(与\)之间,被提取出来,所以,上面的命令的输出结果为salary。

下面命令中正则表达式只有.*,.*匹配了salary.doc:

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

下面命令中正则表达式有.*和.gif两部分,尽管.*可以匹配任意长度的字符串,但是.gif无法匹配salary.doc的任一部分,所以整个匹配是失败的,运行结果为空,并且expr命令的退出状态为1(匹配失败):

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

要显示文件名salary.doc的后缀,可用如下命令:

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

命令中正则表达式有.*、\.和小括号中的.*三部分。其中\.代表小数点本身,不再代表任意字符。从模式匹配的“规矩”可知,.*匹配了salary,\.匹配了salary.doc中的小数点,小括号中的.*匹配了doc。整体匹配是成功的,命令的结果为:显示出小括号中的匹配(或者说,提取小括号中的匹配),所以上面命令的结果为doc。

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

我要反馈