1.前言
由于正则存在很多的流派,所以某些情况下可能会有记忆混淆的情况. 多做测试即可
比如在 grep -E , grep -P, sed 中对"+"的处理, 如果发现没有达到预期的效果,可以尝试添加转移符"+".
2.测试
在linux 终端下, 我们可以利用echo来制造字符串,在使用grep或者sed等工具来测试. 当然很多网站提供正则的测试.
echo aabbcc |grep '[ab]+'
echo aabbcc |grep '[ab]+' -o # 结合-o选项可以只输出匹配的字符串,可以用来观察是否正确的匹配.
3.实战
grep -oP '((?<=GET\s)|(?<=POST\s))[^?\s]+' storm.log
grep -Po '(?<=binVersion=\")[^\"]+' start.php
grep -Po '(?<=versionNum=\")[^\"]+' start.php
ifconfig eth0|grep -Po '(?<=inet addr:).+(?=Bcast)' #获取ip
echo '<b>xx</b>' |grep -Po '(?<=<(b)>).+(?=</\1>)' # html取值xx
# python (pcre)
>>> s
'get /xx/a.html http/1.1 xxx http/1.1 get /xzz/b.html http/1.1'
>>> re.split('get.+?(?:(?<=http/1.1)|$)',s)
['', ' xxx http/1.1 ', '']
>>> re.findall('get.+?(?:(?<=http/1.1)|$)',s)
['get /xx/a.html http/1.1', 'get /xzz/b.html http/1.1']
cat aaa |grep -o '[[:digit:]]\{0,\}' # 是两个[]
=cat aaa |grep -o '[0-9]\{0,\}'
echo '/usr/local/bin/python'|grep '[^/]*' -o #以/分割
grep '\([a-z]\)\1\1\+' #匹配重复字母, 区别于多个字母
grep '\([0-9]\)\1\1' qq.txt
echo ' Port'|sed -n '/^[[:space:]]*P/p' #* 匹配0个或者多个 * 不需要转移
echo ' Port'|sed -n '/^[[:space:]]\+P/p' #+ 匹配1个或者多个 +需要转移
评论