上一节中,我们了解了Bash Shell中的变量计算、变量内容替换和环境变量配置文件相关内容。在了解了变量及其相关运算/操作后,本节开始,我们将一起了解Shell中的字符串处理方面内容,由于Bash的部分命令支持正则表达式,我们也将一并了解正则表达式的基础用法
正则表达式简介
正则表达式是一种字符串匹配模式,用来在文件中匹配符合条件的字符串,正则是包含匹配(文件行中包含条件就匹配),可以用正则表达式匹配更复杂的要求。grep
awk
sed
命令支持正则表达式。
而同样在Shell中使用的通配符则用来匹配符合条件的文件名,是完全匹配,ls
find
cp
不支持正则表达式,仅能使用通配符,通配符的匹配条件较为简单 。
基础正则表达式元字符
元字符 | 作用 |
---|---|
* | 前一个字符匹配0次或任意多次 |
\+ | 前一个字符匹配1次或任意多次 |
. | 匹配除了换行符以外任意一个字符 |
^ | 匹配行首。匹配以后面的文字开头的行 |
$ | 匹配行尾,即以后面的文字结尾的行 |
[] | 匹配括号中指定的任何一个字符(仅一个),同通配符 |
[^] | 取反, 匹配除括号中字符以外的任意一个字符,同通配符 |
\ | 转义符,取消特殊符号的含义 |
\{n\} | 表示其前面的字符恰好出现n次 |
\{n,\} | 表示其前面的字符出现不小于n次 |
\{n,m\} | 表示其前面的字符至少出现n次,最多出现m次。 |
元字符用法及注意事项
-
对于
*
\+
两个元字符(例如"a*"
),若独立作为匹配条件没有意义,由于包含匹配特性,可以有如"aa*"
用"a"
代替的简便方式,该元字符一般用于词内部的单个字符重复情况。例如,要匹配类似于"uuuuuuuraaaaa"(
u
与a
数量未知)的单词,可以使用"u*ra*"
的匹配条件 -
行首元字符必须在第一位,例如
"^abc"
;行尾元字符必须在最后一位,例如"abc$"
-
.
相当于通配符中的?
,可以匹配任意字符,包括空字符 -
方括号类元字符中可以使用枚举型集合,也可以使用区间首尾用减号
-
连接,比如匹配所有小写字母使用"[a-z]"
,匹配非数字字符用"[^0-9]"
。仅针对一个字符 -
花括号(无论左右)的左边必须有转义符
\
-
关于花括号元字符:不是匹配在一行中出现该字符的个数,而是连续出现该字符的个数,独立作为匹配条件时设定最大值无意义,仍可以认为该行中包含了不超过最大值次重复的字符
正则表达式应用场景
支持正则表达式的命令有很多,下面选取比较常用的字符串搜索命令grep
进行样例示范
#grep命令语法
grep [mode] [options] <pattern> <filename>
#描述模式的匹配类型 模式 文件名
- 模式的匹配类型
模式类型 | 作用 |
---|---|
-E | 扩展正则表达式 |
-F | 字符串 |
-G | 基本正则表达式(默认模式类型) |
-P | Perl正则表达式 |
grep
命令常见选项
选项 | 说明 |
---|---|
-n | 显示匹配行的同时显示行号 |
-b | 显示字节偏移(第几个字符) |
-i | 在匹配时忽略大小写 |
-v | 匹配条件取反,显示不匹配该条件的行 |
- 匹配模式即为匹配条件,符合条件的行将被筛选显示
grep
命令同样支持管道符(常用)和控制台输入,控制台输入结束以ctrl
+d
结束(可多行,故不能以enter
结束)- 匹配模式要用双引号
""
包含,否则搜索输出结果可能产生错误
正则表达式示例
首先创建一个带有部分素材的文件,随个人喜好编辑
#以下内容存储在测试素材文件a中
Hello!
I am Zheng@Kali
The excutible files' extension in windows is .exe
I am a enthusiastic man.
My Phone number is 13957191293.
isn't it a good idea?
eeee
uuuuuuraaaaa! uuuraaaa!
-
匹配手机号
手机号的第一位一般为1,第二位一般为3-8,后九位任意
zheng@Kali:~/temp$ grep "1[3-8][0-9]\{9\}" a
My Phone number is 13957191293.
#匹配模式一定要用""包含
-
找出以 i 开头的行
grep "^i" a isn't it a good idea? grep -i "^i" a #使用忽略大小写选项 I am Zheng@Kali I am a enthusiastic man. isn't it a good idea?
-
元字符
*
+
示例示例内容同用法及注意事项
zheng@Kali:~/temp$ grep "u*ra*" a My Phone number is 13957191293. uuuuuuraaaaa! uuuraaaa! zheng@Kali:~/temp$ grep "u*ra\+" a #使用 + 元字符一定要使用转义符,否则相当于直接匹配加号 uuuuuuraaaaa! uuuraaaa!
注意:上示例中u与a没有出现的情况,若行中不出现匹配模式中的字符, 仍然能匹配,而 + 不能匹配*
下一节,Linux Bash Shell编程(七):字符串截取与处理(cut、printf、awk、sed)我们将学习bash中的字符串截取、输出与处理命令
上一节,Linux Bash Shell编程(五):变量(下)变量运算、内容替换、环境变量配置文件