一.正则表达式
包括基础正则表达式和扩展正则表达式两种,主要是用于字符串的模式分割,匹配,查找及替换操作。简单地说就是用来匹配文件中符合条件的字符串,是包含匹配。linux中的grep,awk和sed等命令都支持正则表达式。
基础正则表达式的元字符表:
RE字符 | 意义 |
---|---|
^b | 代表行首匹配,查找行首为b的那一行 |
b$ | 代表行尾匹配,查找行尾为b的那一行 |
. | 代表一定有一个任意字符,如b.b可指bab,bab,bdb…等字符串,只要是以b和b开头和结尾的字符串都符合要求 |
\ | 转义字符,没什么好说的 |
* | 重复零个到无穷多个前一个字符,如ee*可以指e,ee,eee,eee…任意字符可以用.*指代 |
[fgh] | 代表一个待查找的字符,如l[fgh]tu指代lftu,lgtu和lhtu |
[0-9] | 代表想要选取的字符范围,如grep [0-9] filename 指查找filename中的含有任意数字的所有行 |
[^list] | 反向选择,代表查找不含括号中字符的字符串 |
\{n\} | 代表连续n个的的前一个字符,此处的\是转义,消除{}的特性,一般与定界符配合使用 |
\{n,\} | 代表连续n个以上的前一个字符,一般与定界符配合使用 |
\{n,m\} | 连续n到m个的前一个字符,一般与定界符配合使用 |
举栗子
新建一个名为test.test的文件,内容如下:
I am shanebian.
what do you think about me?
e
ee
eee
eeee
eeeeee,,,,
bad
bdb
bcb
aeiou
change you mind
you are good
light
lught
llght
aeeeec
aeec
aeeec
^
匹配行首为you的字符串,并打印行号
grep -n "^you" test.test
结果
10:you are good.
?
匹配行尾为?的字符串,并打印行号
grep -n "?$" test.test
结果
2:what do you think about me?
注意^$代表匹配空白行
.
匹配以b开头和b结尾的字符串,并打印行号
grep -n “b.b” test.test
结果
9:bdb
10:bcd
注意bad那一行字符串没有被打印出来,因为它不是以b结尾。
“*”
匹配包含e的字符串,并打印行号
grep -n "ee*" test.test
结果
1:I am shanebian.
2:what do you think about me?
3:e
4:ee
5:eee
6:eeee
7:eeeeee,,,,
11:aeiou
12:change you mind
13:you are good.
打印14.15.16行
grep -n "l[iul]ght" test.test
结果
14:light
15:lught
16:llght
[ ]
匹配不含有任何字母的字符串,并打印行号
grep -n “[^a-zA-Z]” test.test
结果
1:I am shanebian.
2:what do you think about me?
7:eeeeee,,,,
12:change you mind #这个被打印出来是因为字符串之间有空格
13:you are good.
\{n\}
匹配e连续出现两次的字符串,并打印行号
grep -n “e\{2\}” test.test
结果
4:ee
5:eee
6:eeee
7:eeeeee,,,,
匹配aeec,并打印行号
grep -n "ae\{2\}c" test.test
结果
18:aeec
匹配aeec和aeeec,并打印行号
grep -n "ae\{2,3\}c" test.test
结果
18:aeec
19:aeeec
扩展阅读:wiki上的正则表达式
二.通配符
主要用来匹配符合条件的文件名,是完全匹配。linux中的ls,find和cp等命令都支持通配符。
符号 | 意义 |
---|---|
* | 代表0个到无穷多个任意字符 |
? | 代表一定有一个任意字符 |
[] | 代表一定有一个在中括号内的字符 |
[-] | 代表在编码顺序内的所有字符,比如[1-9]代表1到9之间的所有数字 |
[^] | 代表反向选择,如[^123]代表一定有一个字符,只要是除了1.2.3的其它字符都符合条件 |
通配符比较简单,没有必要举例子加深理解QAQ