it编程 > 编程语言 > 正则表达式

Linux通配符与正则表达式的区别及使用说明

22人参与 2025-04-17 正则表达式

背景

在linux使用过程中,经常需要查找文件,对命令中的通配符 pattern 和正则表达式的区分不是很清楚。有必要好好研究一下。

1 扫盲

通配符和正则表达式

当在使用命令行时,有很多时间都用来查找你所需要的文件,如 ls find 等。 shell 提供了一套完整的字符串模式匹配规则,或者称之为元字符,当 shell 遇到上述字符时,就会把它们当作特殊字符,而不是文件名中的普通字符,这样用户就可以用它们来匹配相应的文件名,我理解这可以称为通配符。

通配符与正则表达式是有区别的,简单来说:通配符是用来通配的,正则表达式是用来匹配字符串的;

通配符是shell自带的用于匹配文件名的工具,多用在文件名上,比如查找findlscp 等等,而正则表达式则需要特定命令的支持才可以使用,如:grepsedawk(号称linux三剑客)、vi/vimperl等,这些都是处理文本的工具。

其次,shell对通配符与正则表达式的处理也有不同,“ ”内一般为通配符(是shell本身提取处理),‘ ’内一般为正则表达式(shell会将其中的数据传递给其它命令处理)。

通配符

常见元字符:

引用以下模式要在外面再套一个[],tr命令则不用(这是规定吗?)

正则表达式

这里不具体介绍正则表达式,只是说一下和通配符的区别

首先通配符没有次数匹配

2 通配符详细介绍

测试数据

touch a a6.log abc.log ac.txt b c c5.txt x.log a

* 代表任意多个字符

? 代表任意单个字符

[] 代表 [] 之间的某一个字符,比如[0-9]可以代表0-9之间的任意一个数字,[a-za-z]可以代表a-za-z之间的任意一个字母,字母区分大小写。

^ 表示匹配结果取反的意思,注意这个通配符必须要在[]中使用

{} 表示符合括号内包含的多个文件

注意: .这个符合比较特殊,如果匹配的条件加上了该符合那么说明查询结果文件就包含带.的文件

例如前面的^的例子,如果我这样查询ll *.[^txt]*,那么结果就不一样了

删除操作

rm -f {[abc],*.txt}

当然既然可以查询当然也可以使用通配符匹配的方式进行移动文件,如果需要在存在很多文件的文件夹中移动某些类型的文件那么使用通配符匹配的效率就显而易见了;当时通配符的使用技巧不单单只有这些,有空的可以多去研究。

3 实例

如:

4 正则表达式详细介绍

正则表达式(也称为“regex”或“regexp”)是一种用来描述文本模式的特殊语法。

在 linux 系统上,正则表达式通常被用来查找文本的模式,以及对文本流执行“搜索-替换”操作以及其它功能。

简单字串

$ grep bash /etc/passwd        
operator:x:11:0:operator:/root:/bin/bash        
root:x:0:0::/root:/bin/bash        
ftp:x:40:1::/home/ftp:/bin/bash 

在上面的命令中,grep 的第一个参数是一个正则表达式;第二个参数是一个文件名。grep 读取 /etc/passwd 中的每一行并对它应用简单子串正则表达式 bash 来查找匹配项。如果找到一个匹配项,那么 grep 打印出整行;否则,忽略该行。

理解简单子串

一般来说,如果您正在搜索一个子串,那么您可以不提供任何“特殊”字符,而只是逐字地指定文本。只有在子串包含 +.*[]/(在这样的情况下,这些字符需要用引号括起来并在它们的前面使用反斜杠)才需要做特殊的事情。

下面是简单子串正则表达式几个其它示例:

  tmp (扫描查找文字串 tmp)        
“\[box\]”(扫描查找文字串 [box])        
“\*funny\*”(扫描查找文字串 *funny*)        
“ld\.so”(扫描查找文字串 ld.so)

元字符

使用正则表达式,可以利用元字符来执行比我们至今已研究过的示例复杂得多的搜索。这些元字符中的一个是 .(点),它与任何单个字符匹配:

$ grep dev.hda /etc/fstab        
/dev/hda3 reiserfs noatime,ro 1 1        
/dev/hda1 /boot reiserfs noauto,noatime,notail 1 2        
/dev/hda2 swap sw 0 0        
#/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1        

在本示例中,文字文本 dev.hda 没有出现在 /etc/fstab 中的任何一行中。但是,grep 扫描这些行时没有查找文字 dev.hda 字符串,而是查找 dev.hda 模式。请记住 . 将与任何单个字符相匹配。正如您看到的,. 元字符在功能上等价于 glob 扩展中 ? 元字符的工作原理。

使用 []

如果我们希望与比 . 更具体一点地来匹配字符,那么我们可以使用 [ 和 ](方括号)来指定要匹配的字符子集:

$ grep dev.hda[12] /etc/fstab        
/dev/hda1 /boot reiserfs noauto,noatime,notail 1 2        
/dev/hda2 swap swap sw 0 0  

[\u4e00-\u9fa5] : 表示任意一个汉字

正如您看到的,这个特殊语法的作用与glob文件名扩展中的 [] 相同。

使用 [^]

通过使 [ 后面紧跟一个 ^,您可以使方括号中的意思相反。在本例中,方括号将与未列在方括号内的任意字符匹配。同样,请注意我们在正则表达式中使用 [^] ,而在 glob 中使用 [!] :

$ grep dev.hda[^12] /etc/fstab        
/dev/hda3 reiserfs noatime,ro 1 1        
/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1   

区别语法

注意下面一点很重要:方括号内部的语法根本不同于正则表达式其它部分中的语法。

例如,如果在方括号内放置一个 . ,那么它允许方括号与文字 . 匹配,就象上面示例中的 1 和 2。比较起来,除非有\ 作为前缀,否则方括号外面的文字 . 被解释为一个元字符。通过输入如下命令,我们可以利用这一事实来打印 /etc/fstab 中包含文字串 dev.hda 的所有行的列表:

$ grep dev[.]hda /etc/fstab

或者,我们也可以输入:

$ grep "dev\.hda" /etc/fstab

这两个正则表达式都不可能与您的 /etc/fstab 文件中的任何行相匹配。

*元字符

某些元字符本身不匹配任何字符,但却修改前一个字符的含义。一个这样的元字符是 * (星号),它用来与前一个字符的零次或者多次重复出现相匹配。

这里是一些示例:

行的开始和结束

我们在这里要详细描述的最后几个元字符是 ^$ 元字符,它们用来分别与行的开始和结束相匹配。通过在正则表达式开始处使用一个 ^ ,您可以将您的模式“锚定”在行的开始。

在下面的示例中,我们使用 ^# 正则表达式来与以 # 字符开始的任何行相匹配:

$ grep ^# /etc/fstab        
# /etc/fstab: static file system information.        
#

完整行正则表达式

可以组合 ^$ 来与完整的行相匹配。

例如,下面的正则表达式将与以 # 字符开始并以. 字符结束的行相匹配,在其中间可以有任意多个其它字符:

$ grep '^#.*/.$' /etc/fstab        
# /etc/fstab: static file system information.  

在上面的示例中,我们用单引号将我们的正则表达式括起来以阻止 shell 解释 $

在不使用单引号的情况下,grep 甚至没有机会查看 $$ 就从我们的正则表达式上消失了。

正则总结

元字符

表示数量的元字符

元字符 说明

换行符 说明

以下字符在匹配其本身时,通常需要进行转义。

在实际应用中,根据具体情况,需要转义的字符可能不止如下所列字符 : $ ^ { [ ( | ) * + ? \

表示位置的符号

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

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

04-17

Nginx 如何配置指向带有哈希值的 index.html 文件?

04-03

SQL REGEXP 正则表达式详解

04-03

如何高效替换HTML字符串中特定标签内容?

04-02

如何从HTML代码中提取特定内容如"label_name":"历史"的字符串?

04-02

如何通过Linux strings命令提取特定类型的字符串

04-01

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论