今天先不学习bash了,想学习一下正则表达式,就是这么任性。
以前也学过一点正则表达式,不过发现不用真的很容易忘,所以写一篇博客加深印象!!
正则表达式分,基础正则表达式,和扩展正则表达式。
语系对正则表达式的影响
在学习我了解到一个知识点,原来语系对正则表达式是有影响的。
比如:
- LANG = C时,01234…ABCD…Zabcd…z
- LANG = zh_CN时,01234…aAbBcCdD…zZ
当我们使用[a-z]在LANG=C中只有小写字母,但在LANG=zh_CN中发现大写字母也在里面。
所以我么使用正则表达式时,要注意环境的语系!
1.基础正则表达式、
用法:
特殊符号 | 代表意义 |
---|---|
[:alnum:] | 0-9,A-Z,a-z |
[:alpha:] | A-Z,a-z |
[:black:] | 代表空格键和tab键 |
[:cntrl:] | 键盘上的控制按键 |
[:digit:] | 0-9 |
[:graph:] | 除了空格键和tab键外的其他所有按键 |
[:lower:] | a-z |
[:print:] | 可以被打印出来的字符 |
[:upper:] | A-Z |
[:space:] | 任何会产生空格的按键 |
[:xdigit:] | 十六进制的数字类型,0-9,A-F,a-f |
练习:使用grep命令来练习。
首先需要一个文件,我使用的是col命令的说明书。
man col > col.man
例子1.找到所有含有数字的行,然后列出前三行。
grep -n '[0-9]' col.man | head -n 3
或者这样写:
grep -n '[[:digit:]]' col.man | head -n 3
例子2:找到st后面接一个字母的行,列出前三行。
grep -n 'st[a-z] col.man | head -n 3
或者grep -n 'st[[:lower:]] col.man | head -n 3
例子3:找到不含大写字母的行,列出前三行。
grep -n '[^[:upper:]]' col.man | head -n 3
提醒:这里发现第一行明明有含有大写字母为什么还行呢?因为它虽然有大写,但它也有小写的字母啊。
例子4:找到开头是空格的行,列出前三行。
grep -n '^[[:space:]]' col.man | head -n 3
可以发现^在[]内和外意思是不同的,[^]意思是反向选择的意思,^[]意思是行首的意思。
例子5:找到行尾是.的行,列出前三行。
grep -n '\.$' col.man | head -n 3
$代表行尾的意思,这里因为.在正则中有其他意思,所以需要使用转义字符。
例子6:去除一个文本多余的空行。
grep -v '^$' col.man
^$比配所有的空白行,-v方向选择。
例子7:使用.号来匹配任意一个字符。
grep -n 'ES.' col.man
这里.匹配的是C这个字符。
例子8:使用*号来匹配重复的字符。
grep -n 'eee*' col.man
*号意思是重复前面字符的0次或以上。
所以’eee*'的匹配的是ee,或者eee,eee…
例子9:使用限定范围符号{}。
grep -n 'fe\{2\}d' col.man
- 这里得使用\转义{},因为他们在bash有其他的意思。
- {},代表了前面字符的范围,这里指的是e的范围是2个,不是2个以上了!
- 若想要2个以上呢?可以加个逗号,{2,}
- 指定一定范围,比如{2,5},2到5个前面的字符。
总结刚刚使用到的字符。
RE字符 | 意义 |
---|---|
^word | 待查找的字符串的行首 |
word$ | 待查找的字符串的行尾 |
. | 匹配一个任意一个字符 |
\ | 转义字符 |
* | 重复0个或以上前面的字符 |
[] | 从中括号中选取想要的字符 |
{} | 限定范围,规定前面字符的数量 |
现在感觉学起来不难,但感觉到时候一起结合起来应用的时候就有难度了…扩展正则表达式明天在学了。