linux正则表达式,反斜线加普通字符作为正则表达式详解

 更新时间:2025年04月17日 09:17:42   作者:weifexie  
这篇文章主要介绍了linux正则表达式,反斜线加普通字符作为正则表达式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

提示:使用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换页符

注意:

  1. 反斜线加上普通字符用作正则表达式时,需要一些选项来说明;如grep使用时,虽不需要加选项 -E,但需要加上选项 -P。实际上 -P也是表示后面样式为某种扩展正则表达式。其次,也并不是所用的反斜线加上普通字符用作正则表达式在被grep使用时都需要加上 -P选项。
  2. \w\W是互补的,\d\D是互补的,\s\S是互补的。
  3. 表中从\b开始,定义模式就不是很常用了,但是在某些场合使用这些表达式可能有奇效。

二、使用方法和案例

在Linux自建命令中,三剑客算是最常使用正则表达式的命令了,下面使用grep、sed、和gawk命令来说明其用法。

1 、grep

所需文本如下

# 文本示例
/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命令的选项和用法

2、sed

所需文本同上

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命令的选项和用法

3、gawk

提示: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正则表达式,有普通的正则表达式和扩展正则表达式,再加上反斜线加普通字符作为正则表达式这一用法,掌握后即可进行下一部分学习了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于Windows 不能在 本地计算器 启动 Apache2(phpstudy)

    关于Windows 不能在 本地计算器 启动 Apache2(phpstudy)

    今天在自己的本子上准备放多个虚拟站点。用的是#phpstudy#。在软件自身的站点设置中,根据提示添加的多站点无效不知道是否和我的系统是Win7有关
    2012-09-09
  • 详解Centos下YUM安装PHP的两种方式

    详解Centos下YUM安装PHP的两种方式

    本篇文章主要介绍了Centos下YUM安装PHP的两种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • CentOS平台快速搭建LAMP环境的方法

    CentOS平台快速搭建LAMP环境的方法

    这篇文章主要介绍了CentOS平台快速搭建LAMP环境的方法,结合实例形式分析了CentOS服务器上搭建LAMP环境的步骤、相关命令与操作注意事项,需要的朋友可以参考下
    2019-05-05
  • Linux paste命令的使用方法

    Linux paste命令的使用方法

    这篇文章主要介绍了Linux paste命令的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • apache的rewrite规则使用说明

    apache的rewrite规则使用说明

    这篇文章主要介绍了apache的rewrite规则使用说明,并带有参考示例,需要的朋友可以参考下
    2014-04-04
  • centos配置mutt和msmtp实现邮件发送

    centos配置mutt和msmtp实现邮件发送

    这篇文章主要为大家详细介绍了centos配置mutt和msmtp实现邮件发送,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Linux 下载安装VSCode 使用编程输出当前时间的方法

    Linux 下载安装VSCode 使用编程输出当前时间的方法

    这篇文章主要介绍了Linux 下载安装VSCode 使用编程输出当前时间,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 分享Linux 系统生成随机密码的10种方法

    分享Linux 系统生成随机密码的10种方法

    利用Linux系统生成随机密码的10种方法 Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它。例如,你可以通过数十种方法来生成随机密码。本文将介绍生成随机密码的十种方法,感兴趣的朋友一起学习吧
    2015-12-12
  • 配置apache默认使用ssl的方法

    配置apache默认使用ssl的方法

    首先确认mod_rewrite已经安装,方法就是查看你的httpd.conf,搜索“LoadModule rewrite_module modules/mod_rewrite.so”,如果有,删除前面的"#"。
    2009-10-10
  • -bash:/usr/bin/yum:没有那个文件或目录的解决方案

    -bash:/usr/bin/yum:没有那个文件或目录的解决方案

    在CentOS系统中,不慎删除或卸载了yum可以通过重新安装来恢复,首先,确认系统版本,例如CentOS,然后新建所需目录以存放下载的文件,接下来,分别从镜像源下载yum组件和python依赖的rpm包,安装python时,如果遇到依赖问题,可选择强制安装
    2024-10-10

最新评论