30人参与 • 2025-04-17 • 正则表达式
提示:使用linux shell是tcsh。
正则表达式是在为用户欲将处理的文本内容设置了样式,然后linux程序、命令等会根据样式来匹配文字。不再赘述该概念。
首先,反斜线\是普通正则表达式,自然也就不需要使用扩展项去告知linux程序、命令等将要匹配的样式指定为扩展正则表达式,省去了很多不必要的麻烦,执行速度也会更快,有些linux命令为了执行速度更快,将样式默认为普通正则表达式。
下列出了反斜线加上普通字符用作正则表达式的情况。
定义模式 | 所包括的字符 | 注释 |
---|---|---|
\d | [0-9] | 单个数字,来自digit |
\d | [a-za-z] | 单个非数字字符 |
\w | [a-za-z0-9_] | 单个字母数字下划线,来自word |
\w | 单个非数字字母下划线的字符 | 匹配符号,如逗号,、空格、短线- 等 |
\s | [:space:]、\n、\t | 单个空格、换行符、或制表符,来自space |
\s | 除空格、换行符、制表符的任意字符 | 如[0-9a-za-z_]、下划线_、短线- 等 |
\b | 单词边界 | |
\b | 非单词边界 | |
\t | 制表符 | 一个大距离的间隔,和4个连续的空格类似 |
\n | 换行符 | 光标调到下一行位置 |
\r | 回车 | 光标回到起始位置 |
\v | 垂直制表符 | |
\f | 换页符 |
注意:
正则表达式
时,需要一些选项来说明;如grep
使用时,虽不需要加选项 -e,但需要加上选项 -p。实际上 -p也是表示后面样式为某种扩展正则表达式。其次,也并不是所用的反斜线加上普通字符用作正则表达式在被grep使用时都需要加上 -p选项。\w
和\w
是互补的,\d
和\d
是互补的,\s
和\s
是互补的。\b
开始,定义模式就不是很常用了,但是在某些场合使用这些表达式可能有奇效。在linux自建命令中,三剑客算是最常使用正则表达式的命令了,下面使用grep、sed、和gawk命令来说明其用法。
所需文本如下
# 文本示例 /home/weifexie/home/try [204]: ls usb4_sc0_t_0.v usb4_sc0_t_0.v /home/weifexie/home/try [206]: cat usb4_sc0_t_0.v //module usb4_sc0_t_0 ( usb4_router_id_in , usb4rt_0_dbgblkid , module usb4_sc0_t ( usb4_router_id_in , usb4rt_0_dbgblkid , input [3:0] usb4_router_id_in ; input [7:0] usb4rt_0_dbgblkid ; sdx_cio0_t_0 sdx_cio0_t ( .usb4_router_id_in ( usb4_router_id_in ) , .usb4rt_0_dbgblkid ( usb4rt_0_dbgblkid ) , # end
grep示例 反斜线加上普通字符用作普通正则表达式,grep命令不需要加选项
# \b、\w、\w、\s、\s的用法,不需要grep加上选项,正则表达式是被看作是普通的正则表达式使用 # 注释:\b是modul的左边锚定,\w可是匹配字母e,\w匹配空格,\s匹配空格,\s可以匹配字母和下划线 /home/weifexie/home/try [265]: grep '//*\bmodul\w*\w[a-z0-9_]*_[0-9]\s(\s\s\s\s[0-9]\s' usb4_sc0_t_0.v //module usb4_sc0_t_0 ( usb4_router_id_in , usb4rt_0_dbgblkid , ---分隔 # 注释:\b是modul的右边锚定,原文为module,故匹配为空 /home/weifexie/home/try [268]: grep '//*\bmodul\b\w*\w[a-z0-9_]*_[0-9]\s(\s\s\s\s[0-9]\s' usb4_sc0_t_0.v ---分隔 # 注释:\b是modul的右边锚定,表示modul右边未结束, /home/weifexie/home/try [269]: grep '//*\bmodul\b\w*\w[a-z0-9_]*_[0-9]\s(\s\s\s\s[0-9]\s' usb4_sc0_t_0.v //module usb4_sc0_t_0 ( usb4_router_id_in , usb4rt_0_dbgblkid ,
匹配样式代码和执行结果,带颜色
grep示例 反斜线加上普通字符用作扩展正则表达式,grep需要加选项 -p
# 注释:\d匹配数字,但是grep没有使用 -p选项,故匹配不成功 /home/weifexie/home/try [272]: grep '//*\bmodul\b\w*\w[a-z0-9_]*_[0-9]\s(\s\s\s\s\d\s' usb4_sc0_t_0.v ---分隔符 # 注释:\d匹配数字,grep使用 -p选项,grep命令出错,显示左小括号(需要一个右小括号组成一个小括号用作分组匹配,分组匹配是扩展表达式的内容, #-p选项是将样式认定为扩展表达式,出错的原因是因为系统觉得少了右小括号,若只保留左小括号作为普通符号使用的话,需要使用转义符 /home/weifexie/home/try [273]: grep -p '//*\bmodul\b\w*\w[a-z0-9_]*_[0-9]\s(\s\s\s\s\d\s' usb4_sc0_t_0.v grep: missing ) ---分隔符 # 使用转义符转义左小括号,\d匹配数字4 /home/weifexie/home/try [274]: grep -p '//*\bmodul\b\w*\w[a-z0-9_]*_[0-9]\s\(\s\s\s\s\d\s' usb4_sc0_t_0.v //module usb4_sc0_t_0 ( usb4_router_id_in , usb4rt_0_dbgblkid ,
匹配样式代码和执行结果,带颜色
将会:会使用另一文详细的介绍grep命令的选项和用法
所需文本同上
sed示例 反斜线加上普通字符用作普通正则表达式,sed不需要选项
# 文本同上 /home/weifexie/home/try [350]: cat usb4_sc0_t_0.v //module usb4_sc0_t_0 ( usb4_router_id_in , usb4rt_0_dbgblkid , module usb4_sc0_t ( usb4_router_id_in , usb4rt_0_dbgblkid , input [3:0] usb4_router_id_in ; input [7:0] usb4rt_0_dbgblkid ; sdx_cio0_t_0 sdx_cio0_t ( .usb4_router_id_in ( usb4_router_id_in ) , .usb4rt_0_dbgblkid ( usb4rt_0_dbgblkid ) , --- # 注释:-n 作用是sed执行的部分才会显示,p表示打印,\b和\b同上,\w匹配字母e,\w匹配下划线,\s匹配空格,\s匹配下划线,\w匹配逗号 /home/weifexie/home/try [351]: sed -n '/\bmodul\b\w\s[a-z0-9]*\wsc[0-9]_t\b\s( usb[0-9]\w[a-za-z]*_[a-z]*\s[a-z]*\s\w/p' usb4_sc0_t_0.v module usb4_sc0_t ( usb4_router_id_in , usb4rt_0_dbgblkid , --- # s///g表示将匹配上的文本替换成指定的文本,下命令意思是将上命令匹配到的文本用iloveu进行替换,即 # “module usb4_sc0_t ( usb4_router_id_in ,”被文本“iloveu”替换 /home/weifexie/home/try [352]: sed -n 's/\bmodul\b\w\s[a-z0-9]*\wsc[0-9]_t\b\s( usb[0-9]\w[a-za-z]*_[a-z]*\s[a-z]*\s\w/iloveu/gp' usb4_sc0_t_0.v iloveu usb4rt_0_dbgblkid ,
sed示例 反斜线加上普通字符用作扩展正则表达式,sed命令需要加选项 -r
# \d即使sed 加上-r也无法使用,\d即使sed 加上-r也无法使用,没有文本能和\d和\d匹配,说明sed -r 不支持 /home/weifexie/home/try [378]: sed -n -r '/\bmodul\b\w\s[a-z0-9]*\wsc[0-9]_t\b\s\( us\d[0-9]\w[a-za-z]*_[a-z]*\s[a-z]*\s\w/p' usb4_sc0_t_0.v --- /home/weifexie/home/try [379]: sed -n -r '/\bmodul\b\w\s[a-z0-9]*\wsc[0-9]_t\b\s\( usb\d\w[a-za-z]*_[a-z]*\s[a-z]*\s\w/p' usb4_sc0_t_0.v --- # sed -r 支持扩展表达式分组符号 /home/weifexie/home/try [380]: sed -n -r '/\bmodul\b\w\s[a-z0-9]*\wsc[0-9]_t\b\s\( usb[0-9]\w[a-za-z]*_[a-z]*\s[a-z]*\s\w/p' usb4_sc0_t_0.v module usb4_sc0_t ( usb4_router_id_in , usb4rt_0_dbgblkid , /home/weifexie/home/try [381]: sed -n -r 's/\bmodul\b\w\s[a-z0-9]*\wsc[0-9]_t\b\s\( usb[0-9]\w[a-za-z]*_[a-z]*\s[a-z]*\s\w/iloveu/pg' usb4_sc0_t_0.v iloveu usb4rt_0_dbgblkid ,
sed -r
支持扩展表达式。
将会:会使用另一文详细的介绍sed命令的选项和用法
提示:gawk和awk区别笔友有很多介绍,这里不做介绍,一言以蔽之,gawk是gnu下的功能更强大的awk版本。
所用文本如下
/home/weifexie/shell_tra [402]: cat phonelist (010)0751-075 (010) 0751-075 010-0751-075 010.0751.075 (021)0751-075 (021) 0751-075 021-0751-075 021.0751.075 (0751)0751-075 (0751) 0751-075 0751-0751-075 0751.0751.075 [751.0751.075 0751.751.075 0751.0751.-75
gawk命令支持普通的正则表达式
gawk命令加上 -r 支持扩展正则表达式,但不支持\d和\d
代码执行如下:
# 下gawk的功能是将匹配/^\(?((010)|(02[0-9])|([0-9]{4}))\)?(| |-|\.)[0-9]{4}(\s|\.)[0-9]{3}$/样式的phonelist文本行打印出来 /home/weifexie/shell_tra [410]: cat phonelist | gawk -r '/^\(?((010)|(02[0-9])|([0-9]{4}))\)?(| |-|\.)[0-9]{4}(-|\.)[0-9]{3}$/ {print $0}' (010)0751-075 (010) 0751-075 010-0751-075 010.0751.075 (021)0751-075 (021) 0751-075 021-0751-075 021.0751.075 (0751)0751-075 (0751) 0751-075 0751-0751-075 0751.0751.075 ---分隔符 # \w匹配0,\s匹配空格,\w匹配短线-,\s匹配短线- /home/weifexie/shell_tra [411]: cat phonelist | gawk -r '/^\(?((\w10)|(02[0-9])|([0-9]{4}))\)?(|\s|\w|\.)[0-9]{4}(\s|\.)[0-9]{3}$/ {print $0}' (010)0751-075 (010) 0751-075 010-0751-075 010.0751.075 (021)0751-075 (021) 0751-075 021-0751-075 021.0751.075 (0751)0751-075 (0751) 0751-075 0751-0751-075 0751.0751.075 ---分隔符
# gawk -r 使用/^\d/样式没有匹配到文本,\d和\d不被支持 /home/weifexie/shell_tra [412]: cat phonelist | gawk -r '/^\(?((\w10)|(02[0-9])|([0-9]{4}))\)?(|\s|\w|\.)[0-9]{4}(\s|\.)[0-9]{3}$/ {print $0}' | gawk -r '/^\d/ {print $0}' ---分隔符 # gawk -r 支持使用/^[0-9]/样式 /home/weifexie/shell_tra [413]: cat phonelist | gawk -r '/^\(?((\w10)|(02[0-9])|([0-9]{4}))\)?(|\s|\w|\.)[0-9]{4}(\s|\.)[0-9]{3}$/ {print $0}' | gawk -r '/^[0-9]/ {print $0}' 010-0751-075 010.0751.075 021-0751-075 021.0751.075 0751-0751-075 0751.0751.075
用一段代码对这些表达式有一个直观的认识,有印象即可,用时候查询。
/home/weifexie/home/try [231]: echo "1\v1" 1 1 /home/weifexie/home/try [232]: echo "1\n1" 1 1 /home/weifexie/home/try [233]: echo "1\f1" 1 1 /home/weifexie/home/try [234]: echo "1\r1" 1 /home/weifexie/home/try [235]: echo "1\t1" 1 1
注释1:\r 右边的1和左边的1重复了,故看似只是echo了一次。\r指的是鼠标光标移到起始位置,echo -n 表示将该行行尾的换行符去掉。
注释2:\v和\f显示的结果很类似,二者之间的差异,==可能之后还会补充==
linux正则表达式,有普通的正则表达式和扩展正则表达式,再加上反斜线加普通字符作为正则表达式这一用法,掌握后即可进行下一部分学习了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论