shell正则表达式
使用正则表达式最大的问题在于有不止一种类型的正则表达式:编程语言(Java,Perl和Python)、Linux实用工具(sed,gawk和grep)以及主流应用(MySQL和PostgreSQL数据服务器)。而且正则表达式是通过正则表达式引擎实现的,其是一套底层软件,负责解释正则表达式模式并使用这些模式进行文本匹配。
在Linux中,有两种流行的正则表达式引擎,POSIX基础正则表达式BRE和POSIX扩展正则表达式ERE,而sed只支持了BRE规范的子集,而gawk则满足ERE,但这也造成gawk的速度要比sed要慢一些。
BRE模式
纯文本:echo "This is a test" | sed -n '/est/p'(其功能就会在目标字符串中去查找是否包含指定字符串,并不限制必须完整字符或者位置)
锚字符^:echo "Books are great" | sed -n '/^Book/p'(指定必须以此字符串开头;同样不要求完成字符而如果出现在匹配字符串中段将只做普通字符处理)
锚字符$:sed -n '/^this is a test$/p' data.txt(指定必须以此字符串结尾)sed -n '/^$/d' data.txt(在输出时删除空行)
点号字符:sed -n '/.at/p' data.txt(匹配换行符之外的任意单一字符,空格也算一个字符)
字符组:sed -n '/[ch]at/p' data.txt(对应位置可以出现[]之内指定的任意一个字符;需要注意的是跟以上匹配相同,它并没有限制在包含指定字符之外的位置还包含其他字符)
排除型字符:sed -n '/[^ch]at/p' data.txt(排除对应位置包含指定字符的字符串,但其必须保证对应位置包含一个字符串)
区间:sed -n '/[a-ch-m]/p' data.txt(指定位置上可以出现的字符区间,可以将多个分隔区间一起书写)
星号:sed -n '/i[ae]*k/p' data.txt(匹配*之前的那个字符或字符组可以出现0次或多次)
扩展正则表达式(gawk)
问号:gawk '/b[ae]?t/{print $0}' data.txt(只允许?之前的字符或字符组出现0次或1次)
加号:gawk '/b[ae]+t/{print $0}' data.txt(只允许+之前的字符或字符组出现至少1次)
花括号:gawk --re-interval '/b[ae]{1,2}t/{print $0}' data.txt(指定之前的字符或字符组出现的次数,同时必须指定 --re-interval 选项)
管道符号:gawk '/cat|dog/{print $0}' data.txt(实现逻辑中的或,同时必须注意|两边不能有空格,否则它将被认为是正则表达式的一部分)
小括号:gawk '/Sat(urday)?/{print $0}' data.txt(小括号中的字符串将被视为单一字符进行处理)