上一节中,我们了解了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@KaliThe excutible files\' extension in windows is .exeI am a enthusiastic man.My Phone number is 13957191293.isn\'t it a good idea?eeeeuuuuuuraaaaa! uuuraaaa!
-
匹配手机号
手机号的第一位一般为1,第二位一般为3-8,后九位任意
zheng@Kali:~/temp$ grep \"1[3-8][0-9]\\{9\\}\" aMy Phone number is 13957191293.#匹配模式一定要用\"\"包含
-
找出以 i 开头的行
grep \"^i\" aisn\'t it a good idea?grep -i \"^i\" a #使用忽略大小写选项I am Zheng@KaliI am a enthusiastic man.isn\'t it a good idea?
-
元字符
*
+
示例
示例内容同用法及注意事项
zheng@Kali:~/temp$ grep \"u*ra*\" aMy 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编程(五):变量(下)变量运算、内容替换、环境变量配置文件