Linux下的正则表达式
Linux下的正则表达式分为基本正则表达式(BRE)和扩展正则表达式(ERE)。扩展正则表达式主要是多了一些元字符,包括{}, ?, +等。通常BRE要比ERE块,sed支持BRE,而awk支持ERE。
通配符与元字符是有区别的。例如ls -al data* 这里的*表示任意字符串,必须完全匹配才可以。*在正则表达式中是元字符,表示上一个字符出现零次或多次,只需包含即可。元字符:*[]^{}\+?|()
基本正则表达式
① 普通模式匹配
输出包含有test的行
sed -n ‘/test/p’ data.txt
awk ‘/test/{print $0}’ data.txt
从上述命令,可以看出,sed和awk的一点区别,就是sed有内置的命令,如s,p。而awk必须显式使用打印和分隔变量
打印出包含有$的文本行
sed -n ‘/\$/p’ data.txt
② ^:以某个字符串开头
打印出以Book开头的文本行
sed -n ‘/^Book/p’ data.txt
③ $:以某个字符串结尾
删除空行
sed ‘/^$/d’ data.txt
④ 点:代表除了\n以外的任意一个字符
跟grep类似
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]at/p’ data.txt
特殊字符组:
[[:alpha:]] 任意字母
sed -n ‘/[[:alpha:]]/p’ data.txt
⑧ 星号*:表示上一个字符会在匹配模式的文本中出现零次或多次
echo ‘ieek’ | sed -n ‘/ie*k/p’
echo ‘baat’ | sed -n ‘/b[ae]*t/p’
.*表示任意多个字符,这与通配符下的*类似
echo ‘this is a regular pattern expression’ | sed -n ‘/regular.*expression/p’
扩展正则表达式
① 问号:上一个字符出现零次或一次
echo ‘bt’ | awk ‘/be?t/{print $0}’
echo ‘bat’ | awk ‘/b[ae]?t/{print $0}’
② 加号:上一个字符出现一次或多次
echo ‘bet’ | awk ‘/be+t/{print $0}’
③ 使用花括号,表示上一个字符出现的次数范围
echo ‘bt’ | gawk --re-interval ‘/be{1}t/{print $0}’
echo ‘beat’ | gawk --re-interval ‘/b[ae]{1,2}t/{print $0}’
④ 管道符号:或者
echo ‘The cat is asleep’ | awk ‘/cat|dog/{print $0}’
⑤ 聚合表达式:看成一个整体字符
echo ‘Sat’ | awk ‘/Sat(turday)?/{print $0}’
参考文献:
Linux命令行大全
Linux命令行与Shell脚本编程大全(第2版)