[26/3/16]正则表达式入门
请一定要把正则表达式和通配符分开!!!
通配符
*:通常代表“任意多个字符(包括 0 个)”?:通常代表“任意单个字符”[list]:指定范围内的单个字符[a-b]:a 到 b 的所有字符,例如 [0-9][^ ]:反向选择
不支持正则表达式的程序会以通配符来解析,例如:
ls -l * 表示任意文件名的文件
ls -l a* 表示任意以 a 开头的文件名
如果要用正则表达式筛选 a 开头的文件名:
ls | grep -n '^a.*'
基础的正则
- 以 x 为行开头:
^x - 以 x 为行结尾:
x$ - 任意的一个(且一定是一个)字符:
. - 0 到无穷个 x:
x* - 转义符号:``
- 可以是列表里的任意一个:
[list] - 范围列表:
[n1-n2] - 不可以是列表里的任意一个:
[^liset] - x 字符可以重复 n 次,其中 a<=n<=b:
x{a,b}(注意有时你需要使用转义符号才能使用{},也就是x{a,b})
一些实例
t[ae]st:匹配 tast 或者 test[^g]oo:匹配不以 g 开头的 oo[^a-z]oo:匹配不以小写字母开头的 oo^the:匹配作为一行开头的 the^[a-zA-Z0-9]:匹配行一开头为数字或者大小写字母.$:匹配行最后为.的内容,因为.本身是特殊字符所以要转义^$:空白行,因为没有内容所以开头和结尾是连到一起的g..d:匹配 g??d,就是中间必须有两个任意字符oo*:至少一个 o 的连续 o,注意这里,由于*可表示 0 个前一字符!g.*g:两个 g 中间可以有任意东西,也可以没有东西!o{2,5}:匹配 2 到 5 个连续的 o
搭配工具
sed:可以将数据进行替换、删除、新增、选取特定行(通常用于一整行的处理)awk:一次处理一行,通常用于把一行分为多个字段来处理diff:比对两个文本文件(或文件夹)内容的不同(按行来比较)cmp:按字节来比较两个文件的不同patch:和 diff 搭配使用,用于更新旧的文件pr:文件打印设置
扩展正则表达式
首先,grep 命令不支持扩展的正则表达式
其次,如果希望使用正则表达式,可以使用 egrep 或者 grep -E
例子:删除空白行和行首为 # 的行
不使用扩展正则:grep -v '^$' filename.txt | grep -v '^#'
使用扩展正则:egrep -v '^$|^#' 这里的 | 表示或运算
扩展正则符号表:
| RE 字符 | 含义 |
|---|---|
| + | 对前面一个字符,要求重复【至少一次】比如 go+d 最小可以查找到 god |
| ? | 对前面一个字符,要求出现【0 或 1 次】比如 go?d 可以查找 gd 或者 god |
| | | 或运算符 |
| () | 群组字符串比如 g(la|oo)d 可以匹配 glad 和 good |
| ()+ | 多个重复群组比如 A(xyz)+C 可以匹配 AxyzxyzC 这种 |