基础正则 BRE
^ 以…开头的行
$ grep '^or' demo1.txt
or 3.6 kilobytes of data transferred.
$ 以…结尾的行
$ grep 'bytes$' demo1.txt
so a two-page letter would be 3600 bytes
One pixel in a photo takes 3 bytes
A 4K photo would take 8,294,400 bytes, or 8.2 Megabytes
注意:利用cat -A
查看结尾是否含有空格。
^$ 空行
空行表示这一行什么都没有,如果有空格则不算是空行。
$ grep '^$' demo1.txt
$ grep -n '^$' demo1.txt
7:
善用-n
显示空行所在位置。
常用于排除空行显示,-v
显示除过滤行以外的其他行内容。
grep -v '^$' demo1.txt
. 任意一个字符
不匹配空行。
grep '.' demo1.txt
\ 转义字符
匹配出以.
结尾的行:
$ grep '\.$' demo1.txt
One pixel in a photo takes 3 bytes.
* 前一个字符重复0次及以上
grep '0*' demo1.txt
不含0
的字符的行也会出现,表示0
出现0次。
.* 任何内容(包括空行)
匹配开头到最后一个p
字符,包括p
:
grep '^.*p' demo1.txt
从上图可以看出正则表达式的贪婪性,尽可能匹配更多的内容。
[] 匹配一次中括号内的任何一个字符
grep '[abc]' demo1.txt
常用范围:
[a-z]
[A-Z]
[0-9]
匹配大小写字母和数字:
grep '[a-zA-Z0-9]' demo1.txt
grep '[a-Z0-9]' demo1.txt
中括号的里内容在大多数情况下会自动去除特殊含义,[a-z|A-Z|0-9]
匹配大小写字母、数字和|
。
[^] 取反/排除
匹配除a-m
的所有内容。
grep '[^a-m]' demo1.txt
扩展正则 ERE
+ 前一个字符重复1次及以上
$ grep -E '0+' demo1.txt
so a two-page letter would be 3600 bytes
A 4K photo would take 8,294,400 bytes, or 8.2 Megabytes
A video is like a photo that changes 30 times a second
注意:使用扩展正则时需要加上-E
参数或者使用egrep
。
匹配出文件中连续出现的数字:
egrep '[0-9]+' demo1.txt
只显示匹配的内容,加上-o
参数。
egrep -o '[0-9]+' demo1.txt
| 或者
$ egrep 'one|two' demo1.txt
requires data to be transmitted between two computers
A single character usually takes one byte
so a two-page letter would be 3600 bytes
one each for red, green and blue in the pixel
() 小括号内的内容表示一个整体
egrep '(t|g)es' demo1.txt
{} 重复出现
格式:o{n,m}
,表示前一个字符o,至少重复n次,最多m次。闭区间[n,m]
egrep '0{1,2}' demo1.txt
格式:o{n}
,表示前一个字符o,重复n次。==n
egrep '0{2}' demo1.txt
还有两种比较少用的情况:o{n,}
,表示前一个字符o,至少重复n次。>=n
o{,m}
,表示前一个字符o,最多重复m次。<=m
? 前一个字符出现0次或1次
例:匹配ge
或gle
,
传统写法:
egrep 'ge|gle' demo1.txt
使用?
的写法:
egrep 'gl?e' demo1.txt