规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式(Regular Expression)。
egrep:grep -E,表示采用Extended正则表达式语法。
fgrep:grep -F,表示只搜索固定字符串而不搜索正则表达式模式,不会按正则表达式的语法解释后面的参数。
正则表达式参数用单引号括起来了,因为正则表达式中用到的很多特殊字符在Shell中也有特殊含义(例如\),只有用单引号括起来才能保证这些字符原封不动地传给grep命令,而不会被Shell解释掉。
1.字符类
. 匹配除换行符以外的任意一个字符 如:abc. 结果为 abcd, abc9
[m-n] 匹配[]中的一个字符,减号-表示范围。数字或字符都可以。
[^xy] 匹配除x或y开头的任一字符,如排除x1,y2
[[:xxx:]] 预定义的 [[:alpha:]]匹配一个字母,[[:digit:]]匹配一个数字
\w
匹配字母或数字或下划线或汉字 [ a-z0-9A-Z_]
\s
匹配任意的空白符
\d
匹配数字 [0-9] \d不一定好使
\W
匹配任意不是字母,数字,下划线,汉字的字符\S
匹配任意不是空白符的字符\D
匹配任意非数字的字符
2.数量限定符
x表示一个或多个字符或者一种模式 也可以理解为重复前面的次数
x? x要匹配0或1次 Windows\d+
匹配Windows后面跟1个或更多数字 单词 数字 0或1次
x+ x要匹配1或多次 ^\w+
匹配一行的第一个单词(或整个字符串的第一个单词
x* x要匹配0或多次
x{n} x要精确匹配n次
x{m,n} x匹配m到n次
x{m,} x至少匹配m次
x{,n} x最多匹配n次
3.位置限定符
^x 以x开头的行 [
^x ]
匹配除了x以外的任意字符
x$ 以x结尾的行
^$ 空行
\<x 以x开头的单词
x\> 以x结尾的单词
\bx或 x\b 匹配x开头或x结尾的位置 \bat\b匹配... at ...,但不匹配cat、atexit、battry
\Bx或x\B 匹配非x开头和x结尾的位置 \Bat\B匹配battery,但不匹配... attend、hat ...
\G
上一个匹配的结尾(本次匹配开始)
\A
字符串开头(类似^
,但不受处理多行选项的影响)
\Z
字符串结尾或行尾(不受处理多行选项的影响)
\z
字符串结尾(类似$
,但不受处理多行选项的影响)
例子:
cat 1.txt
at
i am at home
cat
attend
whatis this
thisatthis
>>grep '\bat\b' 1.txt
at
i am at home
>>grep '\Bat\B' 1.txt
whatis this
thisatthis
4.其他
\ 转义 比如\.
() 作为一个整体
| 或 abc[d|f] 匹配abcd, abcf
字符转义
grep -E '^([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3})$' 1.txt
192.168.0.111
^ 限制开头是3位 ,以防找出1192.168.xxx这种字符串
$ 限制末尾是3位, 以防找出xxx.168.xxx.1111这种字符串
---------------
0
[0-9]{2}-
[0-9]{8}|0
[0-9]{3}-
[0-9]{7}
这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8} \d可换成
[0-9]
这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。
假设 file.txt 内容如下:
leecode题目
987-123-4567
123 456 7890
(123) 456-7890
你的脚本应当输出下列有效的电话号码:
987-123-4567
(123) 456-7890
grep -E '^((\([0-9]{3}\)\s)|([0-9]{3}-))[0-9]{3}-[0-9]{4}$' file.txt