Linux-文本处理工具sed
Linux-文本处理工具awk
Linux-文本处理工具grep
Linux-文本处理工具cut
Linux-正则表达式RE
正则表达式RE 说白了就是文本处理工具
重要的文本处理工具:vim、sed、awk、grep
mysql、oracle、php、python、Apache、Nginx …
一、什么是正则表达式? 匹配字符串
正则表达式(regular expression, RE)是一种字符模式,用于在查找过程中匹配指定的字符。在大多数程序里,正则表达式都被置于两个正斜杠之间;例如/l[oO]ve/就是由正斜杠界定的正则表达式,它将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念。
二、元字符
定义:元字符是这样一类字符,它们表达的是不同于字面本身的含义
shell元字符(也称为通配符) 由shell来解析,如rm -rf .pdf,元字符 Shell将其解析为任意多个字符
正则表达式元字符 由各种执行模式匹配操作的程序来解析,比如vi、grep、sed、awk、python,java,go
[root@tianyun ~]# rm -rf *.pdf
[root@tianyun ~]# grep 'abc*' /etc/passwd
abrt:x:173:173::/etc/abrt:/sbin/nologin
echo “abc”| grep ‘abc*’
abc
echo “abcccccc”| grep ‘abc*’
abcccccc
1.正则表达式元字符:
2. 基本正则表达式元字符
元字符 | 功能 | 示列 | |
---|---|---|---|
^ | 行首定位符 | ^love | grep ‘^root’ /etc/passwd |
$ | 行尾定位符 | love$ | grep ‘root$’ /etc/passwd |
. | 匹配当前位置任意一个字符 | l…e | grep ‘^r…t’ /etc/passwd |
* | 匹配当前位置 .前一个或多个字符. 0到多个. 字符 | ab*love | grep ‘ro*t’ /etc/passwd |
.* | 任意多个字符 | grep ‘r*ot’ /etc/passwd | grep ‘r**t’ /etc/passwd |
[] | 匹配指定范围内的一个字符 [lL]ove | grep ‘[rx]oot’ /etc/passwd | 只能iove 或 love |
[ - ] | 匹配指定范围内的一个字符 [a-z0-9]ove | grep ‘[a-z0-9]oot’ /etc/passwd | a-z 中的一个 或 0-9 中的一个 |
[^] | 匹配不在指定组内的字符 | [^a-z0-9]ove | grep ‘[^a-z0-9]oot’ /etc/passwd |
^ | 在字符类符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义! 重点!!! | 匹配行首的(才能匹配到) | |
\ | 用来转义元字符 | love. | |
< | 词首定位符 | <love | 无用 |
> | 词尾定位符 | love> | 无用 |
(…) | 匹配稍后使用的字符的标签 | :% 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/ | 给某些行加注释, 转意后 把9换成6 只换9前面有字符的 | ||
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 |
() | 组字符 | loveable | rs love(able |
(…)(…)\1\2 | 标签匹配字符 | (love)able\1er |
- POSIX字符类:
表达式 | 功能 | 示列 |
---|---|---|
[:alnum:] | 字母与数字字符 | [[:alnum:]]+ |
[:alpha:] | 字母字符(包括大小写字母) | [[:alpha:]]{4} |
[:blank:] | 空格与制表符 | [[:blank:]]*2+++ |
[:digit:] | 数字字母 | [[:digit:]]? |
[:lower:] | 小写字母 | [[:lower:]]{5,} |
[:upper:] | 大写字母 | [[:upper:]]+ |
[:punct:] | 标点符号 | [[:punct:]] |
[:space:] | 包括换行符,回车等在内的所有空白 | [[:space:]]+ |
三、正则匹配示例:vim
/love/
/^love/
/love$/
/l.ve/
/lo*ve/
/[Ll]ove/
/love[a-z]/
/love[^a-zA-Z0-9]/
/.*/
/^$/
/^[A-Z]..$/
/^[A-Z][a-z ]*3[0-5]/
/[a-z]*\./
/^ *[A-Z][a-z][a-z]$/ 开头是空格的
/^[A-Za-z]*[^,][A-Za-z]*$/ 小写字母结束的
/\<fourth\>/
/\<f.*th\>/
/5{2}2{3}\./
空行
/^$/
^代表行首
$代表行尾
^$意思就是行首之后就是行尾,中间什么也没有
/^[ \t]*$/
注释行
/^#/
/^[ \t]*#/
:1,$ s/\([Oo]ccur\)ence/\1rence/
:1,$ s/\(square\) and \(fair\)/\2 and \1/
========================================================
s/^[ \t]* #是将这一行起始的空白字符删掉
s/[ \t].*// #是将空白及以后的内容删掉s/[ \t].*//
表示如果匹配到以制表符开头的字符串那就把开头的制表符去掉,s/[ \t].*//表示如果在字符串中有制表符那么把制表符去掉。就是去掉匹配字符串中的制表符