首页linux进阶 正文 文章最后更新时间:2025年06月11日 ### 通配符与正则表达式区别与联系: #### 1. 区别: - **通配符**: - 主要用于文件名匹配,由shell解释,用于`ls`、`cp`、`mv`、`rm`、`find`等命令。 - 功能相对简单,侧重于文件名的匹配,例如文件扩展和部分字符的匹配。 - **正则表达式**: - 更强大和灵活,用于文本处理,由文本处理工具(如`grep`、`sed`、`awk`)解释。 - 可用于复杂的文本匹配、查找、替换和提取操作,可处理行内的字符模式。 #### 2. 联系: - 它们都使用一些相似的符号(如`*`、`?`、`[]`),但含义可能不同。 - 都是为了匹配或筛选字符序列,但应用场景和解释器不同。 ### 基本通配符 - **`*`(星号)**:代表零个或多个字符。 - `ls *.txt` 会列出所有以`.txt`结尾的文件。 - `rm *bak` 会删除所有以`bak`结尾的文件。 ```bash [ldx@VM-20-5-opencloudos ~]$ ls 1.txt 2.txt alss remoce.txt test [ldx@VM-20-5-opencloudos ~]$ ls *.txt 1.txt 2.txt remoce.txt ``` - **`?`(问号)**:代表一个字符。 - `ls file?.txt` 会列出`file1.txt`、`file2.txt`等,但不会列出`file10.txt`。 ```bash [ldx@VM-20-5-opencloudos ~]$ ls 1.txt 2.txt alss remoce.txt test [ldx@VM-20-5-opencloudos ~]$ ls ?.txt 1.txt 2.txt ``` - **`[]`(中括号)**:代表一个字符的范围或集合。 - `ls file[1-3].txt` 会列出`file1.txt`、`file2.txt`和`file3.txt`。 - `ls file[a-z].txt` 会列出以`file`开头,后面跟一个小写字母,再跟`.txt`的文件。 ```bash [ldx@VM-20-5-opencloudos ~]$ ls 1.txt 2.txt 3.txt 4.txt 5.txt alss remoce.txt test [ldx@VM-20-5-opencloudos ~]$ ls [1-3].txt 1.txt 2.txt 3.txt ``` - **`[^ ]`或`[! ]`**:代表不在范围或集合内的字符。 - `ls file[^a-z].txt` 会列出以`file`开头,后面跟一个非小写字母,再跟`.txt`的文件。 ```bash [ldx@VM-20-5-opencloudos ~]$ ls [a-z]*.txt ab.txt remoce.txt x.txt [ldx@VM-20-5-opencloudos ~]$ ls [!a-z]*.txt 1a.txt 1.txt 2.txt 3.txt 4.txt 5.txt ``` ### 正则表达式 #### 1. 基本元字符: - **`.`(点)**:代表任意一个字符。 - 例如,`a.c`可以匹配`abc`、`aac`、`axc`等。 - **`^`(脱字符)**:匹配行的开始。 - 例如,`^start`会匹配以`start`开头的行。 - **`$`(美元符号)**:匹配行的结束。 - 例如,`end$`会匹配以`end`结尾的行。 - **`*`(星号)**:匹配前面的元素零次或多次。 - 例如,`ab*c`可以匹配`ac`、`abc`、`abbc`、`abbbc`等。 - **`+`(加号)**:匹配前面的元素一次或多次。 - 例如,`ab+c`可以匹配`abc`、`abbc`、`abbbc`等,但不匹配`ac`。 - **`?`(问号)**:匹配前面的元素零次或一次。 - 例如,`ab?c`可以匹配`ac`或`abc`。 - **`{n}`**:匹配前面的元素恰好n次。 - 例如,`ab{2}c`会匹配`abbc`。 - **`{n,}`**:匹配前面的元素至少n次。 - 例如,`ab{2,}c`会匹配`abbc`、`abbbc`等。 - **`{n,m}`**:匹配前面的元素n到m次。 - 例如,`ab{2,4}c`会匹配`abbc`、`abbbc`、`abbbbc`。 - **`[]`(中括号)**:匹配括号内的任意一个字符。 - 例如,`[abc]`会匹配`a`、`b`或`c`。 - **`[^ ]`或`[! ]`**:匹配不在括号内的任意一个字符。 - 例如,`[^abc]`会匹配除`a`、`b`、`c`外的任何字符。 #### 2. 特殊字符类: - **`\d`或`[0-9]`**:匹配一个数字。 - **`\D`或`[^0-9]`**:匹配一个非数字字符。 - **`\w`或`[a-zA-Z0-9_]`**:匹配一个单词字符(字母、数字或下划线)。 - **`\W`或`[^a-zA-Z0-9_]`**:匹配一个非单词字符。 - **`\s`**:匹配一个空白字符(空格、制表符、换行符等)。 - **`\S`**:匹配一个非空白字符。 #### 3. 正则表达式使用示例: - 在`grep`命令中:`grep '^start.*end$' file.txt`会在`file.txt`中查找以`start`开头,以`end`结尾的行。 - 在`sed`命令中:`sed 's/[0-9]\+/X/g' file.txt`会将`file.txt`中所有的数字序列替换为`X`。 - 在`awk`命令中:`awk '/^[a-zA-Z]+$/{print $0}' file.txt`会打印出`file.txt`中只包含字母的行。 #### 4. 转义字符: 在正则表达式和通配符中,某些字符具有特殊含义,要匹配它们的字面意义,需要使用转义字符`\`。例如,要匹配`*`本身,在正则表达式中使用`\*`,在通配符中可能需要`\*`或单引号将其括起来。 ### 正则表达式练习 ```bash # 练习文本 John Doe, 25 years old, lives at 123 Main St, Apt 4B, New York, NY 10001. Jane Smith, 30 years old, lives at 456 Elm St, Apt 7C, Los Angeles, CA 90001. Mike Johnson, 42 years old, lives at 789 Oak St, Apt 10D, Chicago, IL 60601. Alice Williams, 28 years old, lives at 321 Pine St, Apt 5E, Houston, TX 77001. Bob Brown, 35 years old, lives at 654 Maple St, Apt 8F, Philadelphia, PA 19101. Contact phone numbers: John: (123) 456-7890 Jane: (234) 567-8901 Mike: (345) 678-9012 Alice: (456) 789-0123 Bob: (567) 890-1234 Emails: john.doe@example.com jane.smith@example.org mike.johnson@example.net alice.williams@example.co.uk bob.brown@example.io Product IDs: P001, P002, P003, P004, P005 Order numbers: O12345, O23456, O34567, O45678, O56789 Dates: 2023-01-15, 2022-12-25, 2021-05-10, 2020-08-30, 2019-11-20 ``` #### 编写一个正则表达式,匹配所有的姓名(只匹配名字和姓氏)。 ```bash [ldx@VM-20-5-opencloudos ~]$ grep -E '[A-Z][a-z]+\s[A-Z][a-z]+' test | awk -F ',' '{print $1}' John Doe Jane Smith Mike Johnson Alice Williams Bob Brown ``` - 解释:`[A-Z]`匹配一个大写字母,`[a-z]+`匹配一个或多个小写字母,`\s`匹配一个空格。 #### 编写一个正则表达式,匹配所有的年龄(只匹配数字)。 ```bash cat test | grep -E '[A-Z][a-z]' | grep -v ':' | cut -d ',' -f 2 | awk '{print $1}' 25 30 42 28 35 ``` #### 编写一个正则表达式,匹配所有的电话号码(格式为 (xxx) xxx-xxxx)。 ```bash [ldx@VM-20-5-opencloudos ~]$ cat test | grep -P "\(\d{3}\)\s\d{3}-\d{4}" John: (123) 456-7890 Jane: (234) 567-8901 Mike: (345) 678-9012 Alice: (456) 789-0123 Bob: (567) 890-1234 ``` - 答案:`\(\d{3}\)\s\d{3}-\d{4}` - 解释:`\(\d{3}\)`匹配括号内的三个数字,`\s`匹配一个空格,`\d{3}-\d{4}`匹配三个数字、一个短横线和四个数字。 #### 编写一个正则表达式,匹配所有的电子邮件地址。 ```bash [ldx@VM-20-5-opencloudos ~]$ cat test | grep -P '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' john.doe@example.com jane.smith@example.org mike.johnson@example.net alice.williams@example.co.uk bob.brown@example.io ``` - 答案:`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}` #### 编写一个正则表达式,匹配所有的日期(格式为 YYYY-MM-DD)。 ```bash [ldx@VM-20-5-opencloudos ~]$ cat test | grep -P '\d{4}+-\d{2}+-\d{2}' 2023-01-15, 2022-12-25, 2021-05-10, 2020-08-30, 2019-11-20 ``` - 答案:`\d{4}-\d{2}-\d{2}` ### 正则式拓展 #### 一、正则表达式分类: 1. 基本的正则表达式(Basic Regular Expression,BREs) 2. 扩展的正则表达式(Extended Regular Expression,EREs) 3. Perl 的正则表达式(Perl Regular Expression,PREs) #### 二、Linux 中常用文本工具与正则表达式的关系 - **grep / egrep**: - `grep`支持BREs、EREs、PREs(默认BREs,`-E`参数用EREs,`-P`参数用PREs)。 - `egrep`支持EREs、PREs(默认EREs,`-P`参数用PREs)。 - **sed**: - 支持BREs、EREs(默认BREs,`-r`参数用EREs),可对文本进行查找、替换、删除、增加等操作。 - **awk(gawk)**: - 支持EREs(默认使用),主要对列进行操作。 #### 三、常见3种类型正则表达式比较 - **BREs**:使用基础元字符,如`*`、`.`、`[]`,不支持`+`、`?`等扩展操作符。 - **EREs**:扩展了BREs,支持`+`、`?`、`{n}`、`|`(或)、`()`(分组)等更灵活的语法。 - **PREs**:基于Perl语法,支持`\d`、`\w`等特殊字符类,以及正向/负向断言、非贪婪匹配等高级功能。 - 文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。