一 linux中正则使用杂谈
① 常见
常见: 'awk'、'sed'、'grep'、'vim'、'nginx' --> '工具命令'
1) grep支持'三种'正则表达式BRE,ERE,PCRE,而其'默认'使用的是'BRE' --> grep -P|E
2) sed'默认'也使用'BRE',sed -E或sed -r'使用ERE',sed'不支持'PCRE
3) awk'默认'就是'ERE',它不支持BRE与PCRE
4) vim 的正则匹配引擎是'独有'的, 其风格'类似'于POSIX,但是也支持各种自己实现的'高级特性'
5) nginx使用的是'PCRE'正则
6) PCRE发布了两个'新的轮子'pcregrep与pcre2grep --> "了解即可"
重要: 'perl'、'python'、'lua'、'Java' --> "语言类,按照自己认为的重要程度排序"
② [[ expression ]]中的=~ 重点
1) bash '3.0' 在 '[[ ]]' 这个运算子加入 'egrep形式'的 regexp,'ERE'正则风格
备注: 一会'粗略'讲解'ERE'的正则风格;ERE不支持'环视匹配',不支持'\d',但支持'[[:digit:]]'
核心: ^$|[]()\.*+? 不需要'转义'
2) 可以使用'三个'运算符 ==、!=、'=~'
备注: 主要专注'最后一个=~'的'ERE'正规表示式
3) 理解: '0'、'1'、'2'状态码的含义
最佳实践: '正则pattern'用'变量'表示,引用的时候'不要'用"双引号"包括
对比: perl中也有'=~'的正则,不过是'PCRE'风格,用'/pattern/',并且功能更'强'
重点: '=~' 涉及 'BASH_REMATCH数组',获取'捕获组'
1) 'BASH_REMATCH[0]'是正则模式匹配的'字符串'
2) 'BASH_REMATCH[n]'是'第n个组()'补获,无法使用'\n'捕获引用
+++++++++++ "其它方式观察BASH_REMATCH" +++++++++++
for i in "${BASH_REMATCH[@]}";do echo $i;done;
set | grep BASH_REMATCH
意外收获: '=='和'!='只支持'POSIX Glob通配符',非'正则'
++++++++++ "题外话" ++++++++++
1) 不包含指定字符串所在行,即'过滤','取反'能力 --> ^((?!wzj).)*$
③ find
1) 常用: 查找以".log"结尾的'文件'
find -name "*.log"
默认: -regextype emacs
特点: 不支持'精确'匹配
2) 细节点
[1]、-regex'不是'匹配文件名,而是'完整路径'匹配,'类似内含'^和$'
[2]、如果'-regextype'指定'正则风格',则必须通过'-regex'指定正则的'pattern'
可选: emacs posix-awk、posix-basic、 posix-egrep 、 'posix-extended(ERE推荐)'
[3]、'4.2.24' 版本引入 '-regextype' ; '3.8' 版本引入 '-iregex'
3) 案例: find /home/kiosk -regextype posix-extended -regex '.*wzj-[0-9]+.*'