Linux笔记-正则表达式
本文最后更新于 2025年9月22日 凌晨
“Linux笔记”系列博客是在阅读学习《鸟叔的LINUX私房菜》书籍时形成的思维导图,将其整理为笔记形式。包含以下部分:
正则表达式RegularExpression
一种字符串处理的表示方式。正则表达式可用在多种场合,常见的用法是用grep/sed/awk命令对文件内容进行匹配筛选,如 grep -n "g..d" tmp.txt 命令匹配文件中含有g??d形式的行,并输出行号。还可用于vim编辑器中。
特殊符号
- [:alnum:]:英文大小写字符及数字(注意匹配时要写双层方括号,如 [[:alnum:]] 、[^[:digit:]])
- [:alpha:]:英文大小写字符
- [:lower:]:英文小写字符,即a~z
- [:upper:]:英文大写字符,即A~Z
- [:digit:]:数字,即0~9
- [:blank:]:空格键与Tab键
- [:graph:]:除了空格符(空格键与[Tab]按键)外的其他所有按键
- [:cntrl:]:控制按键,包括CR、LF、Tab、Del等
- [:print:]:代表任何可以被打印出来的字符
- [:punct:]:代表标点符号(punctuation symbol),亦即:”‘?!;:#$
- [:space:]:任何会产生空白的字符,包括空格键、[Tab]、 CR等
- [:xdigit:]:代表十六进制的数字类型,因此包括0 ~ 9、A ~ F、a ~ f 的数字与字符
基础RE字符
- ^word:^匹配行首
- word$:$匹配行尾
- .:小数点,匹配一个任意字符
- *:星号,与一个RE字符搭配使用,表示前一个RE字符重复0到无穷多次(注意正则表达式与通配符不同,通配符中星号代表0到无穷多个字符,?代表任意一个字符)
- \:将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\\‘ 匹配 “\“,而 ‘\(‘ 则匹配 “(“。
- [list]:字符集合,匹配一个方括号中的字符,注意仅匹配一个
- [n1-n2]:字符范围,匹配两个字符之间的连续字符中的一个
- [^list]:反向选择,匹配不在list中的字符
- {n,m}:代表前一个RE字符重复n到m次,{n}表示重复n次,{n,}表示重复至少n次
注意 { 与 } 符号在shell中有特殊含义(用于变量),所以如果在shell中grep使用正则,要加上转义符\ 。例如输入
grep -n "o\{2\}" tmp.txt将在文件中匹配含有两个o的字符串。在其他地方用正则不用这样。
拓展RE字符
- 拓展正则表达式要使用egrep(grep -E的别名)或sed -r,见私房菜P376
- +:加号,与一个RE字符搭配使用,表示前一个RE字符重复1到无穷多次
- ?:问号,与一个RE字符搭配使用,表示前一个RE字符重复0或1次
- |:或,如 gd|god
- ( ):标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用
- ( )+:多个重复群组的判别
例子
- t[ae]st 匹配test或tast
- [^g]oo 匹配oo,但前边不能是g
- [^[:lower:]]oo 匹配oo,前边不能是小写字母
- [0-9]或[[:digit:]] 匹配数字0-9
- ^the 匹配位于行首的the
- ^[^[:alpha:]] 匹配行首非英文字母
- \.$ 匹配以小数点结尾的行
- ^$ 匹配空白行
- ^# 匹配以#开头的行
- a* 匹配0到无穷多个字符a
- aa* 匹配1到无穷多个字符a,以此类推
- .* 匹配0到无穷多个任意字符
- go{2,5}g 匹配两个g中间出现2~5次o
例:
grep -n "go\{2,5\}g" tmp.txt
Linux笔记-正则表达式
https://leo.zz.ac/posts/789.html