king

Linux入门基础—正则表达式详解

king linux 2023-01-24 448浏览 0

正则表达式是用来匹配字符串的,针对文件内容的文本过滤工具里,大都用到正则表达式,如vi,grep,awk,sed等。

定义

由特殊的字符或者文件编写的模式,其中的字符和文本并不是字面意思,而是表示控制或者通配功能

Linux入门基础—正则表达式详解
Linux入门基础—正则表达式详解

分类

基本正则表达式 BRE

字符匹配

匹配任意单个字符  .
匹配范围内的任意单个字符  **[]
匹配范围外的任意单个字符  **[^]

匹配任意单个字母  [[:alpha:]]
匹配任意单个数字[0-9] [[:digit:]]
匹配任意单个字母或数字[0-9a-z] [[:alnum:]]
匹配所有大写字母[[:upper:]]
匹配所有小写字母[a-z] [[:lower:]]
匹配标点符号[[:punct:]]
匹配空白字符[[:space:]]

匹配次数

匹配其前面的任意字符任意次数(0次、1次、多次)*
匹配任意长度的任意字符 .*
匹配其前面的字符至多1次(0次、1次)\?
匹配其前面的字符至少1次(1次、多次)\+
匹配其前面字符m次 \{m\}
匹配其前面字符至少m次至多n次 \{m,n\}
匹配其前面字符至多n次 \{0,n\}
匹配其前面字符至少m次 \{m,\}

练习

准备文件

[root@localhost ~]# cat a.txt
abxy
aby
xxxxxy
yab

演示

[root@localhost ~]# grep x*y a.txt
abxy
aby
xxxxxy
yab
[root@localhost ~]# grep "x\?y" a.txt
abxy
aby
xxxxxy
yab
[root@localhost ~]# grep "x\+y" a.txt
abxy
xxxxxy
[root@localhost ~]# grep "x\{1\}y" a.txt
abxy
xxxxxy

位置锚定

行首锚定 ^
行尾锚定 $
PATTERN匹配整行 ^pattern$
空白行 ^$
空行或包含空白字符的行 ^[[space]]*$

单词:非特殊字符组成的连续字符(字符串)都称为单词
词首锚定 \< 或 \b
词尾锚定 \> 或 \b
匹配完整单词 \

练习

显示/etc/passwd文件中不以/bin/bash结尾的行

grep -v "/bin/bash$" /etc/passwd

找出/etc/passwd文件中的两位数或三位数

grep "\<[0-9]\{2,3\}\>" /etc/passwd

找出/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行

grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

找出ifconfig中的ip地址

ifconfig ens33 | grep -Eo "(\<[0-9]{1,3}\>\.){3}\<[0-9]{1,3}\>" | head -1

分组及引用(后项引用)

\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理
\(abc\)\(123\)\(ybc\) 命令行中括号有特殊意义所以用转义符
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符 abc
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符 123
\3:模式从左侧起,第三个左括号以及与之匹配的右括号之间的模式所匹配到的字符 456

示例

[root@localhost ~]# cat file1
He loves his lover.
He likes his lover.
She likes her liker.
She lover her liker.
id name score
1 liming 1
2 zhangkai 2
3 taotao 100
[root@zycentos7 ~]# grep "\(l..e\).*\1" file1
[root@zycentos7 ~]# grep "\([0-9]\).*\1" file1

扩展正则表达式 ERE

扩展正则表达式与基本正则表达式基本相同,用法相似,除了词首词尾锚定一样,其他只是在基本正则表达式中去掉转义字符

与基本正则表达式的比较:写法上比较简单,去掉了大量的转义字符;但需要匹配特殊字符时,扩展正则表达式需将特殊字符用 [ ] 括起来使用,这时用基本正则表达式比较方便

分类 表达式 含义
字符匹配 . 任意单个字符
[ ] 指定范围内的任意单个字符
[^] 指定范围内的任意单个字符
匹配次数 * 任意次:0,1或多次
0次或者1次
+ 其前字符至少出现1次
{m} 其前的字符出现m次
{m,n} 至少m次,至多n次
{0,n} 至多n次
{m,} 至少m次
位置锚定 ^ 行首锚定
$ 行尾锚定
<,\b 词首锚定
>,\b 词尾锚定
分组及引用 () 括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中
()……\1 引用
a|b a或者b

继续浏览有关 Linux教程 的文章
发表评论