心路历程
在shell的正则表达式里常用的有
- sed(stream editor)
- grep(file pattern searcher)
- BASH_REMATCH(Bash3.x自带表达式 =~ )
值得注意的是以上三种都不支持非贪婪模式(non-greedy)的匹配,因为无法对一行字符串进行多次匹配,参考regex in bash expression
Example
我们假设摘取以下字符串里的key值 some_important_string
1 | string="HEREISKEY some_important_string HEREISVALUE some_value" |
sed
sed的使用方法比较特别,需要遵守 s/regexp/replacement/flags 的使用模版参考文档
- \1 表示("some_(.+)") 匹配的内容
- \2 表示(.+)匹配的内容
代表将表达式 “^.* ("some_(.+)") .*” 匹配到的字符替换为 “\1” 也就是 “("some_(.+)")” 并输出
1 | echo "HEREISKEY \"some_important_string\" HEREISVALUE \"some_value\"" | sed -E "s/^.* (\"some_(.+)\") .*/\1/" |
grep
grep不像sed一样可以使用 -E 参数来表达正则,而不用对大部分符号使用转义符
1 | echo "HEREISKEY \"some_important_string\" HEREISVALUE \"some_value\"" | grep -o -E "\"some_(.+)\"\s" |
BASH_REMATCH
该方法为自带表达式 推荐使用这一种 其思想和 sed一样,是按照顺序将结果放入数组
| 数组下标 | 匹配表达式 | 匹配结果 |
| :————- | :————- |
| BASH_REMATCH[0] | ^.( "some_(.+)" ). | HEREISKEY “some_important_string” HEREISVALUE “some_value” |
| BASH_REMATCH[1] | ( "some_(.+)" ) | “some_important_string” |
| BASH_REMATCH[2] | (.+) | important_string |
1 | if [[ "HEREISKEY \"some_important_string\" HEREISVALUE \"some_value\"" =~ ^.*( \"some_(.+)\" ).* ]] ; then echo ${BASH_REMATCH[1]}; fi |
三者区别
命令 | 思想 |
---|---|
sed、BASH_REMATCH | 先匹配全文,然后将自表达式匹配结果依次放入index |
grep | 直接截取表达式匹配到的部分,并不会把自表达式放入index |