正则表达式
什么是正则表达式
简单的说,正则表达式就是处理字串的方法,他是以行为单位来进行字串的处理行为, 正则表达式通过一些特殊符号的辅助,可以让使用者轻易的达到“搜寻/删除/取代”某特定字串的处理程序!
正则表达式基本上是一种“表达式”, 只要工具程序支持这种表达式,那么该工具程序就可以用来作为正则表达式的字串处理之用。 例如 vi, grep, awk ,sed 等等工具,因为她们有支持正则表达式, 所以,这些工具就可以使用正则表达式的特殊字符来进行字串的处理。但例如 cp, ls 等指令并未支持正则表达式, 所以就只能使用 Bash 自己本身的通配符而已。
是 Linux 基础当中的基础,如果学成了之后,一定是“大大的有帮助”的!这就好像是金庸小说里面的学武难关:任督二脉! 打通任督二脉之后,武功立刻成倍成长!
关于语系
在英文大小写的编码顺序中,zh_TW.big5 及 C 这两种语系的输出结果分别如下:
LANG=C 时:0 1 2 3 4 ... A B C D ... Z a b c d ...z
LANG=zh_TW 时:0 1 2 3 4 ... a A b B c C d D ... z Z
11414906-9202fd962e4bbaf8.png
重点 11414906-9202fd962e4bbaf8.png
[:alnum] 代表所有的大小写英文字符和数字 0-9 A—Z a-z
[:alpha:] 代表任意英文大小写字符 A-Z a-z
[:lower:] 代表小写字符 a-z
[:upper:] 代表大写字符 A-Z
[:digit:] 代表数字 0-9
练习示例文件
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
However, this dress is about $ 3183 dollars.
GNU is free air not free beer.
Her hair is very beauty.
I can't finish the test.
Oh! The soup taste good.
motorcycle is cheap than car.
This window is clear.
the symbol '*' is represented as start.
Oh! My god!
The gd software is a library for drafting programs.
You are the best is mean you are the no. 1.
The world <Happy> is the same with "glad".
I like dog.
google is the best tools for search keyword.
goooooogle yes!
go! go! Let's go.
# I am VBird
digit_20191217152106.png
xx_20191217152918.png
11414906-e103d416eb4b9b7b.png
11414906-076f52e0912edc67.png
11414906-3559c6cea2602b03.png
^ 搜索以什么开头的一行
[root@biudefor script]# grep '^#' zhengze.sh
# I am VBird
$ 搜索以什么结尾的那一行
[root@biudefor script]# grep '!$' zhengze.sh
Oh! My god!
gooooooogle yes!
. 相当于一个字符替代品 e.e=eae/ebe/ece
[root@biudefor script]# grep 'e.e' zhengze.sh
"Open Source" is a good mechanism to d'eve'lop programs.
How'eve'r, this dress is about $ 3183 dollars.
the symbol '*' is repr'ese'nted as start.
\ 将反斜线后的一个特殊符转义成普通字符
[root@biudefor script]# grep \' zhengze.sh
this dress doesn't fit me.
I can't finish the test.
the symbol '*' is represented as start.
go! go! Let's go.
* 匹配*前面的零个或无穷多个前一个字符
'ess*' 可以匹配到ess或者es
'es*' 可以匹配到es或者e
'ess*'和'eeeess*'的差别在于eeeess的前提条件发生改变
[root@biudefor script]# grep 'ess*' zhengze.sh
[] 匹配[]括号中的任意'一个' 字符,里面的字符取 或 的关系
[root@biudefor script]# grep 'g[ojdhdff]d' zhengze.sh
Oh! My god!
[n1-n2] 匹配一个范围
[^] []括号内取反
\{n,m\} 连续的n到m 个前一个字符
[root@biudefor ~]# grep 'go\{1,2\}g' /script/zhengze.sh
'goog'le is the best tools for search keyword.
[root@biudefor ~]# grep 'go\{1,2\}' /script/zhengze.sh
"Open Source" is a 'goo'd mechanism to develop programs.
Oh! The soup taste 'goo'd.
Oh! My 'go'd!
'goo'gle is the best tools for search keyword.
'goo'ooooogle yes!
'go'! 'go'! Let's 'go'.
进阶 grep
[root@biudefor script]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1422836 0 143012 0 0 3 1 48 50 0 0 100 0 0
[root@biudefor script]# vmstat | grep -v procs
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1422916 0 143044 0 0 3 1 48 50 0 0 100 0 0
#### grep -v 能过滤掉不需要的某一行
[root@biudefor ~]# grep mail -B2 -A3 /etc/passwd //显示 /etc/passwd 含有 mail 的行及其前2行和后 3 行
------------------------------------------------------------------
[root@biudefor ~]# grep mail -C 2 /etc/passwd //显示 /etc/passwd 含有mail 的行以及前两行和后三行
------------------------------------------------------------------
[root@biudefor ~]# grep -o mail /etc/passwd //只显示匹配到到的字符
mail
mail
mail
------------------------------------------------------------------
[root@biudefor ~]# grep -o -c 'mail' /etc/passwd //只显示匹配到的字符并统计数量
1
-------------------------------------------------------------------
[root@biudefor ~]# grep -l 'nologin' /etc/passwd //只显示文件名
/etc/passwd
-------------------------------------------------------------------
[root@biudefor ~]# grep -r 'mail' /etc //递归,可以指定目录查找
-------------------------------------------------------------------
[root@biudefor ~]# grep -n 't[ea]st' /script/zhengze.sh //搜索test或tast并显示行号
-------------------------------------------------------------------
[root@biudefor script]# grep -n '[^g]oo' zhengze.sh //搜索oo当前面不要有g
2:apple is my favorite 'foo'd.
3:'Foo'tball game is not use feet only.
18:'goo'gle is the best 'too'ls for search keyword.
19:g'ooo''ooo'ogle yes!
-------------------------------------------------------------------
[root@biudefor script]# grep '[^a-z]oo' zhengze.sh //显示oo前面不是小写字符的行
[root@biudefor script]# grep '[^[:lower:]]oo' zhengze.sh
'Foo'tball game is not use feet only.
-------------------------------------------------------------------
[root@biudefor script]# grep '^[^[:lower:]]oo' zhengze.sh //开头不是英文的行
"Open Source" is a good mechanism to develop programs.
# I am VBird
###### 符号 ^ 在 [] 内时是取反的意思,在 [] 之外是行首的意思
-------------------------------------------------------------------
[root@biudefor script]# grep '^[^#;]' zhengze.sh //开头不是#,;
-------------------------------------------------------------------
[root@biudefor script]# grep '\.$' zhengze.sh //不是以.结尾的行,\转义
-------------------------------------------------------------------
[root@biudefor script]# grep '^g.*o$' zhengze.sh //g开头,o结尾,中间字符任意
-------------------------------------------------------------------
[root@biudefor script]# grep 'go\{2,4\}g' zhengze.sh //查找含有2到4个o ,且以 g 结尾的字符串
google is the best tools for search keyword.
wc
[root@biudefor script]# grep 'g.*' zhengze.sh | wc
10 58 315 //行数,单词数,字符数
[root@biudefor script]# grep 'g.*' zhengze.sh | wc -l //只显示行数
10
[root@biudefor script]# grep 'g.*' zhengze.sh
"Open Source" is a good mechanism to develop programs.
Football game is not use feet only.
Oh! The soup taste good.
Oh! My god!
The gd software is a library for drafting programs.
The world <Happy> is the same with "glad".
I like dog.
google is the best tools for search keyword.
gooooooogle yes!
go! go! Let's go.
扩展正则
11414906-25c3f5d58e017037.png支持扩展正则的工具
- grep -E
- egrep
- sed
- awk
须掌握:
^ 行首定位符 ^love
$ 行尾定位符 love$
. 匹配单个字符 l..e
* 匹配前导符 0 到多次 ab*love
.* 任意多个字符
[] 匹配指定范围内的一个字符 [lL]ove
[ - ] 匹配指定范围内的一个字符 [a-z0-9]ove
[^] 匹配不在指定组内的字符 [^a-z0-9]ove
\ 用来转义元字符 love\.
\< 词首定位符 \<love
\> 词尾定位符 love\>
\(..\) 匹配稍后使用的字符的标签(只能栝1-9个) :% s/172.16.130.1/172.16.130.5/
:% s/\(172.16.130.\)1/\15/
:% s/\(172.\)\(16.\)\(130.\)1/\1\2\35/
:3,9 s/\(.*\)/#\1/
x\{m\} 字符 x 重复出现 m 次 o\{5\} x\{m,\} 字符 x 重复出现 m 次以上 o\{5,\}
x\{m,n\} 字符 x 重复出现 m 到 n 次 o\{5,10\}
===扩展正则表达式元字符
+ 匹配一个或多个前导字符 [a-z]+ove
? 匹配零个或一个前导字符 lo?ve
a|b 匹配 a 或 b love|hate
() 组字符 loveable|rs love(able|rs) ov+ (ov)+
(..)(..)\1\2 标签匹配字符 (love)able\1er
x{m} 字符 x 重复 m 次 o{5}
x{m,} 字符 x 重复至少 m 次 o{5,}
x{m,n} 字符 x 重复 m 到 n 次 o{5,10}
正则匹配示例:vim
/love/ 寻找love
/^love/ love开头
/love$/ love结尾
/l.ve/ l 中间有任意一个字符,后面是 ve
/lo*ve/ o可以出现零次到多次
/[Ll]ove/ 匹配love或Love
/love[a-z]/ love后面有一个任意的小写字母
/love[^a-zA-Z0-9]/ love后面出现的字符不是a-zA-Z0-9中的任意一个字符,可能是特殊字符
/.*/ 整行
/^$/ 空行
/^[A-Z]..$/ 开头是大写字母,结尾是两个任意字符
/^[A-Z][a-z]*3[0-5]/ 开头是大写字母,后面是0-n个小写字母,然后3,最后是0-5的一个数字
/[a-z]*\./ 前面是0-n个小写字母,后面加一个 .
/^ *[A-Z][a-z][a-z]$/ 以0-n个空格开头的,后面是一个大写字母和两个小写字母
/^[A-Za-z]*[^,][A-Za-z]*$/ 开头是大写字母或小写字母,后面不能是逗号,结尾是零个或n个大写或小写字母
/\<fourth\>/ 寻找fourth这个单词
/\<f.*th\>/ 寻找f 任意字符 th
/5{2}2{3}\./ 55333.
空行
/^$/ 空行
/^[ \t]*$/ 0-n个空格或tab
注释行
/^#/ 以#开头的行
/^[ \t]*#/ 开头有0-n个空格或tab,后面有#号的行
:1,$ s/\([Oo]ccur\)ence/\1rence/
:1,$ s/\(square\) and \(fair\)/\2 and \1/
hello* 0-n 前一个字符
hello? 0-1 前一个字符
hello+ 1-n 前一个字符
hello{2} 2 前一个字符
(hello)* 0-n 前一个字符组
(hello)? 0-1 前一个字符组
(hello)+ 1-n 前一个字符组
(hello){2} 2 前一个字符组
网友评论