正则表达式和通配符的区别

2023-10-27

http://www.eetop.cn/blog/html/65/554165-26125.html

http://blog.csdn.net/whxlovehy/article/details/6052366

Explain 1:
1、正则表达式是用来匹配字符串的,这个就不解释了
2、通配符是用来通配文件名的,也就是shell在做Pathname Expansion时用到的

Explain 2:
通配符,说白了一般只用于文件名匹配,它是由shell解析的。所谓的系统level的概念非常含糊,什么是系统level的?我们知道shell是一个命令解释器,它是内核的外壳,用于完成操作系统使用者与内核的沟通,因此,通配符实际上就是一个shell解释器去解析的符号,它的特殊涵义是由shell这个命令解释器赋予的。通配符的英文名是wildcard,就是万用牌的意思,它相当简单,一般来说,*nix系统上面的shell大多将三个特殊符号当作通配符,它们是 * ? [...], 其中 * 表示匹配任意长度的任意字符; ? 表示匹配一个任意字符, 而[...]则表示匹配括号中列出的字符中的任意一个。

    其次。什么是正则表达式(regular expression, 缩写是regex.)?从简单的角度去理解,你可以把正则表达式看成是一种字符串匹配模式标准。这里最重要的就是,它本身,只是一种业界流行的标准,或者说,它是相当于对字符串匹配模式的一种规定。这种规定是随着相关的工具软件的发展而自称体系的“不成文规矩”。
    -- 举个例子好了。假设首先有一种工具软件能够根据“模式(pattern)”搜索字符串,这个工具非常流行,以至于后续的工具软件都效仿那个工具软件定义的模式规则来匹配字符串 -- 慢慢的就形成标准,而且相对来说是一种不成文的规矩.
    所以,正则表达式是什么? -- 它是一种对字符串匹配模式的描述和规定 -- 并且是一种标准。而不同的工具程序,也就是egrep、sed、awk这样的程序,以各种程度来支持这种字符串搜索模式,它们就是标准的实现,你可以在这种软件中使用正则表达式这种“匹配模式标准”。 -- 明白?

    所以,在什么地方使用通配符?答案是只要是shell命令行或者shell脚本中,你都可以使用通配符;
    在什么地方使用正则表达式?当你使用能够支持正则表达式的工具软件进行字符串处理时你就可以使用正则表达式。你还可以在支持正则表达式的语言中使用正则表达式,比如perl, java... C++中也有专门用于支持正则表达式的库。正则表达式总是和“使用什么工具软件或者语言”相关。相对来说,不同的工具和语言对正则表达式的支持程度不同,*nix里面将这些工具软件的对正则表达式的支持分类,因此也就有了“基础正则表达式”和“扩展正则表达式”。
   
    不同的工具对正则表达式的支持,其实有些许的微妙不同;但是总体来说,使用正则还是基本按照标准来的。这些不同的工具支持程度,被称之为“正则流派”。而工具软件中支持这种匹配模式的那部分代码,称之为“正则引擎”。由于perl对正则表达式的支持非常到位,其正则引擎也比较优秀,因此perl语言算是正则的一大流派,目前大部分对正则的支持都或多或少参考了perl语言中的标准。

shell通配符

(假设当前目录下有chap , .chap , chap01 , chap02 , chap15 , chap16 , chapa ,chapb

1.命令在shell中的一般执行过程:

当我们在终端输入一个命令时,该命令将作为shell的输入。shell想扫描输入的命令行,搜索元字符(通配符等)。元字符对命令本身来说,没有任何意义,但是对shell来说有特殊意义。当shell搜索到> , | ,*等元字符时,它在命令执行之前,先解释这些元字符说代表的意义(即命令的预处理过程),如将“rm *”命令中的"*"替换为当前目录下的所有文件名。当所有的预处理都完成后,shell将命令行传送给内核,最后由内核负责运行命令。此时的命令行里面不再有元字符。当内核正在执行命令时,shell就处于等待状态,等待来自内核的这个命令结束运行的消息。命令运行结束后,shell再次显示提示符,等待用户输入下一个命令。

2.shell的通配符:


 

通配符 匹配方式 实例 注意
* 任意个字符,包括空字符 ls *chap* 命令将输出:
Chap chap01 chap02 chap15 chap16  chapa  chapb chapc
*并不匹配以‘.’开头的文件(通常为linux中的隐藏文件)
和路径中的/字符。
但是可以匹配文件名中的多个‘.’
? 单个字符 ls chap? 命令将输出:
Chapa  chapb
 
[abc] a,b,c中的一个字符 ls chap[abc] 命令将输出:
Chapa chapb chapc
 
[!abc] 除a,b,c之外的任意字符(不局限于26个字母)    
[a-z] a到z之间的任意一个asscii字符 ls chap[a-c] 命令将输出:
Chapa chapb chapc
[a-zA-Z]表示所有的26个大小写字母中的一个。使用
连字符时,左边的ASCII码必须小于右边的ASCII码。
在ASSIC序列中,大写字母排在小写字母前面
[!a-x] 除a到z之外的任意一asscii字符    
{pat1,pat2} 模式1,模式2等 ls chap{,01,15,a} 命令将输出:
Chap chap01 chap15
 

3.转义与引用

当我们在shell要使用字符本身的意义而不是其通配意义时,可以使用转移字符'/',如ls /* 表示查看文件名为*的文件,而非查看以/开头的文件。也可以用引用的方法,如ls '*'表示查看文件名为*的文件。转义有两种方法,一是使用单引号,而是使用双引号。他们的区别是双引号没有单引号那么严格,它不会保护其中的$`(反引号符),双引号中的$`还是会被shell解释。



 

正则表达式

正则表达式类似于通配符,起到一个类似于通配的作用,但是与通配符不同的是这个表达式是命令的一个特性,与shell没有任何关系。它是有命令自己解释而不是shell,它适用于使用正则表达式的程序,如grepsed等。由于正则表达式是由命令自己来解释而不是由shell来解释,所以必须用引号以阻止shell按它的意思对正则表达式中的元字符进行解释

1.基本正则表达式(Basic Regular Expression,BRE


 

通配符 匹配方式 实例
* *前一个字符的零次或多次出现 g* 代表空字符或g , gg , ggg等
. .代表单个字符 .*代表空字符或任意个字符
[abc] a,b,c中的一个字符  
[a-z] a到z之间的任意一个asscii字符 [1-3]表示1到3之间的某个数字
[^abc] 除a,b,c之外的任意字符(不局限于26个字母)  
[^a-z] 除a到z之外的任意一asscii字符 [^a-zA-Z]表示非字母字符
^pat 行首为pat模式 ^bash表示行首为bash
pat$ 行尾为pat模式 ^pat$表示一行中只有单词pat
^$ 表示空行  

2.扩展正则表达式(Expand Regular ExpressionEBR

 

表达式 含义 实例
+ 匹配一个或多个它前面的字符
(与*的区别在于它不能匹配空串)
 
? 匹配零个或一个它前面的字符
(与.的区别在于它可以匹配零个前面的字符)
 
exp1|exp2 匹配exp1或exp2 GIF|JPEG表示GIF或JPEF
(x1|x2)x3 匹配x1x3或x2x3 (a|b)cd匹配acd或者bcd

3.其他基本正则表达式(以sed命令举例)

  • 重复模式——使用&符号,它表示出现在目标串中的源模式串;

    我们常会遇到这样的情形:源模式串也出现在目标串中,我们就可以使用&这个特殊字符表示出现在目标串中的源模式串。

    例:(以下两个命令效果相同)

    sed 's/director/executive director/' tmp.lst

          sed 's/director/executive &/' tmp.lst

  • 间隔正则表达式(Interval Regular Expression,IRE)——{}里面使用一个或一对数值;

    ch/{m/}——表示字符ch出现m

    ch/{m,n/}——表示字符ch出现次数在mn之间

    ch/{m,/}——表示字符ch至少出现m

    (其中ch可以是一个字符,或者一个.点,或者一个字符类。Mn的值不能大于255

    例:

    sed -n /./{101,/}/p foo (选取字符数大于100的行)

    grep ^./{101,150/}$ foo(选取行长度为101150之间的行,注意此处的^$

  • 带标志的正则表达式(Tagged Regular Expression,IRE)——把多个模式串用()组成组,在目标串中用数值标签表示。

    TRE的工作过程:我们必须先确定处理的行和一行中各段内容,把每段内容放在一对圆括号里,圆括号用转义字符表示。各段的模式自动获得一个数值标号nn表示从左边开始的第n组。为了在目标串中使用这些组,必须使用/n标签。这意味着,第一个组用/1表示,第二个组用/2表示,等等

4.元字符不起作用的情形及转义:

正则表达式中脱字符^有三个作用,当它在字符类的前面(即[^a-z])时,表示对字符类取反;当它在字符类 的外面且在表达式的最前面时(如^2)时,表示匹配行首位置;在其他位置则表示它自己。当-在字符类里而它的两侧没有其他字符时,或者当他出现于字符类外面时,-将失去其原意。当.*在字符类之类将失去原意,当*在表达式的第一个字符时,将按它的字面意义进行匹配。如果要在元字符起作用的地方使用元字符本身,则使用/字符进行转义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式和通配符的区别 的相关文章

  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • 在 shell 脚本中将一个子字符串替换为另一个字符串

    我有 我爱苏子并结婚 我想将 苏子 更改为 萨拉 firstString I love Suzi and Marry secondString Sara 期望的结果 firstString I love Sara and Marry 要更换
  • 如何使用 sed 将空格替换为 \(space)?

    当我使用 sed 将所有空格替换为 X 时 该命令有效 命令为 sed s X g filelist tmp 但是 当我尝试用 space 替换所有出现的空格时 代码是 sed s g filelist tmp 这不起作用 我究竟做错了什么
  • 每个命令都返回“bash:<命令>:找不到命令...”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我刚刚安装了 Scala 并添加了路径gedit bashrc export SCALA HOME home avijit sca
  • Bash 脚本监听按键以继续

    因此 我想编写一个由一系列步骤组成的 bash 脚本 并将其标识为 task 然而 每个步骤都只能完成并且可以根据用户的需要运行 Do task1 if keypressed stop task1 and move on this is t
  • 在 UNIX 中删除相同的文件

    我正在处理大量 30 000 个 大小约为 10MB 的文件 其中一些 我估计 2 实际上是重复的 我只需要为每个重复的对 或三元组 保留一个副本 您能建议我一种有效的方法吗 我正在unix上工作 您可以尝试使用此代码片段在删除之前先获取所
  • 如何在 C# 中启动文件

    编辑 我觉得自己像个白痴 我有一种感觉 像下面的答案会起作用 但没有看到任何与下面的答案类似的谷歌结果 所以当我看到这段复杂的代码时 我想它一定是这样的 我搜索并找到了这个Windows 列出并启动与扩展关联的应用程序 https stac
  • 如何在Shell脚本中解析字符串

    我想在 shell 脚本中解析以下字符串 VERSION 2 6 32 54 0 11 def 这里我想得到两个值 first 263254 second 11 我使用以下方法来获取第一个值 first expr substr VERSIO
  • awk 返回两个变量

    现在这就是我正在做的事情 ret ls la awk print 3 9 usr echo ret awk print 1 fil echo ret awk print 2 问题是我没有运行ls我正在运行一个需要时间的命令 因此您可以理解其
  • shell解析json并循环输出组合变量

    杰斯克喜欢我之前的话题 https stackoverflow com questions 74063588 shell parsing json contains spaces in string 我知道如何解析带有空格的简单 json
  • exec()、shell_exec()、curl_exec() 的安全漏洞

    有时 我会使用 exec shell exec 和curl exec 以下是典型用途 假设其中有 PHP 变量 即第一个变量中的 html 用户有可能修改其内容 从安全漏洞的角度来看 我应该关注什么 escapeshellcmd 和 esc
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • 批量检测系统是32位还是64位

    有谁知道如何创建一个批处理文件 如果是 64 位系统 可以对一个程序进行 shell 处理 如果是 32 位系统 则可以对另一个程序进行 shell 处理 检查 PROCESSOR ARCHITECTURE being x86 if PRO
  • 如何将输出重定向到文件,如果文件不存在则不创建它?

    我需要将输出重定向到一个文件 gt 在 shell 中 但如果该文件尚不存在 则不应创建该文件 如何实现这一目标 我尝试创建文件的符号链接并重定向到符号链接 但不幸的是 如果文件尚不存在 无论如何都会创建文件 也许我需要重定向到一个单独的程
  • 在 shell/shell 脚本中设置 MongoDB 写关注

    我正在尝试填充一个集合MongoDB的壳 据我了解 使用轻松的Write Concern可以大大加快这个过程 我说的是文档 http docs mongodb org manual core write concern write oper
  • HBase Shell 日志记录

    使用 HBase shell 时 我收到大量日志记录 包括 INFO 和 DEBUG 消息 虽然这对于学习 HBase 内部结构来说很有趣 但它非常冗长并且可能会掩盖输出 我尝试过以多种不同的方式更改日志记录级别 包括所描述的here ht
  • Bash 目录上的 For 循环

    快速背景 ls src file1 file2 dir1 dir2 dir3 Script bin bash for i in src do if d i then echo i fi done Output src dir1 src di
  • 如何在不使用 MacPorts 或 Fink 的情况下在 OS X Leopard 上安装 lxml?

    我过去曾多次尝试过此操作并遇到问题 有没有人有在没有 MacPorts 或 Fink 的情况下在 OS X 上安装 lxml 的方法 并且绝对有效 最好有完整的 1 2 3 步骤来下载和构建每个依赖项 感谢 Twitter 上的 jesse
  • LaunchAgent 不运行 shell 脚本

    在 Catalina 之前的 macOS 下 我有一个每天运行 shell 脚本的 LaunchAgent 升级并切换到 zsh 后 它不起作用 我检查过的事情 shebang 切换到 zsh shell脚本可以从命令行手动执行 sh 在系
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚

随机推荐