Linux 正则表达式 的简介


Linux 正则表达式 的简介

  • 一、📖 正则表达式的两种主要"风格"
  • 二、🔤 核心元字符与语法格式(以ERE为例)
      1. 定位符(锚点)
      1. 匹配字符
      1. 指定数量(量词)
      1. 分组与选择
  • 三、💻 在Linux常用命令中的实战示例
  • 四、⚠️ 重要注意事项与技巧

Linux 中的正则表达式 是一种强大、灵活且高效的文本模式匹配工具。它通过一系列特殊字符和普通字符的组合,定义一个"搜索规则"或"匹配模式",用于在文本中进行查找、替换、提取等操作。可以说,它是处理文本的"瑞士军刀"。

简单来说,正则表达式 = 普通字符 + 特殊字符(元字符)


一、📖 正则表达式的两种主要"风格"

在Linux中,最常遇到的是以下两种风格,主要由 grep, sed, awk 等工具支持,其核心差异在于对元字符的转义要求不同

特性 基本正则表达式 (BRE) 扩展正则表达式 (ERE) 说明与建议
启用方式 grep 的默认模式 grep -Eegrep 最常用的差异,务必记住。
元字符 ^ $ . [ ] * 是元字符 增加 `( ) { } ? + ` 为元字符
举例:匹配2-3个a a\{2,3\} (需转义) a{2,3} (无需转义) 你之前用的 ={2,} 是 ERE 语法,所以要用 grep -E
选择分支 不支持 `(pattern1 pattern2)`
分组 \(...\) (需转义) (...) 将一部分模式括起来,用于后续引用或应用量词。

核心建议初学者建议直接学习和使用扩展正则表达式,因为它更直观、强大,且是现代编程语言(如Python, JavaScript)中正则语法的基础。


二、🔤 核心元字符与语法格式(以ERE为例)

下表是必须掌握的"语法单词",按照功能分类:

1. 定位符(锚点)

元字符 含义 示例 匹配内容
^ 匹配行的开始 ^Hello 以 "Hello" 开头的行。
$ 匹配行的结束 world$ 以 "world" 结尾的行。
\b 匹配单词边界 \bthe\b 独立的单词 "the",而非 "there" 中的 "the"。

2. 匹配字符

元字符 含义 示例 匹配内容
. 匹配任意一个字符(换行符除外) a.c "abc", "adc", "a@c" 等。
[ ] 字符组,匹配其中任意一个字符 [aeiou] 任意一个元音字母。
[^ ] 否定字符组,匹配不在其中的字符 [^0-9] 任意一个非数字字符。
\d 匹配一个数字(部分工具支持) \d+ 一个或多个数字。在Linux传统工具中,等价的BRE写法是 [[:digit:]][0-9]
\w 匹配一个单词字符(字母、数字、下划线) \w+ 一个或多个单词字符。BRE中等价于 [[:alnum:]_]

3. 指定数量(量词)

元字符 含义 示例 匹配内容
* 匹配前面的元素0次或多次 ab*c "ac", "abc", "abbc" ...
+ 匹配前面的元素1次或多次 ab+c "abc", "abbc" ... (不含"ac")
? 匹配前面的元素0次或1次 colou?r "color" 或 "colour"。
{n} 匹配前面的元素恰好 n 次 a{3} "aaa"。
{n,} 匹配前面的元素至少 n 次 a{2,} "aa", "aaa", "aaaa" ... (你之前关卡用到的)
{n,m} 匹配前面的元素n 到 m 次 a{2,4} "aa", "aaa", "aaaa"。

4. 分组与选择

元字符 含义 示例 匹配内容
( ) 分组,将多个元素视为一个单元 (ab)+ "ab", "abab", "ababab" ...
` ` 选择,匹配左边或右边的模式 `cat

三、💻 在Linux常用命令中的实战示例

假设我们有一个文件 test.txt,内容如下:

复制代码
Hello, world!
My email is alice@example.com.
The price is $19.99.
The numbers are 42, 7, and 1024.
你想做的事 使用的正则表达式命令 解释与输出
查找包含"email"的行 grep 'email' test.txt 普通查找,非正则。
查找以"The"开头的行 grep '^The' test.txt 使用锚点 ^
查找所有数字 grep -Eo '[0-9]+' test.txt -o 只输出匹配部分。输出:19, 99, 42, 7, 1024
查找所有价格($数字.数字) grep -Eo '\$[0-9]+\.[0-9]{2}' test.txt 匹配美元价格格式。输出:$19.99。注意 $. 需要转义。
查找邮箱地址 grep -Eo '[[:alnum:]._%+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}' test.txt 一个简化版的邮箱匹配。输出:alice@example.com
sed 替换所有数字为"NUM" sed -E 's/[0-9]+/NUM/g' test.txt 将文件中所有连续数字替换为"NUM"。
find 找 .txt 和 .log 文件 `find . -regex '.*.\(txt log)'` (BRE)

四、⚠️ 重要注意事项与技巧

  1. 贪婪匹配 :正则默认是"贪婪"的,会匹配尽可能长的字符串。例如,a.*b 匹配 "axxxbyyyb" 中的 "axxxbyyyb",而不是 "axxxb"。可以使用 .*? 来启用"非贪婪"匹配(ERE中部分工具支持,如 grep -P 的Perl模式)。
  2. 特殊字符转义 :如果你想匹配元字符本身(如 .*$),需要在它前面加上反斜线 \ 进行转义。例如,\$ 匹配美元符号,\. 匹配点号。
  3. 性能 :复杂的正则表达式(尤其是嵌套*+)在超大文本中可能很慢。尽量让模式精确。
  4. 工具差异grepsedawkfind 对正则的支持程度和默认风格有细微差别,使用时注意查阅手册(man command)。grep -P 支持功能最全的Perl正则,但非所有系统默认安装。

学习路径建议 :从 grep -Esed -E 开始练习,重点掌握 ^$[...]*+?{ }|( ) 这些核心元字符。理解它们后,你已经能解决Linux中90%的文本匹配问题了。


相关推荐
chinesegf2 小时前
虚拟机ubuntu中磁盘满了 + 镜像损坏,如何解决
linux·运维·ubuntu
神秘剑客_CN2 小时前
deepin安装Bottles并运行win程序
linux
Mr.H01272 小时前
Linux常见压缩命令
linux·服务器·数据库
梁洪飞2 小时前
kernel 内存知识
linux·arm开发·嵌入式硬件·arm
鸠摩智首席音效师2 小时前
如何在 Linux 中使用 sort 命令排序 ?
linux·运维·服务器
Lenyiin2 小时前
《 Linux 修炼全景指南: 十三 》环境变量
linux·运维·服务器
旖旎夜光2 小时前
Linux(11)(上)
linux·学习
私房菜2 小时前
Linux内存管理(81):compact_zone 详解
linux·compaction·kcompactd·proactive·compact_zone
傅科摆 _ py3 小时前
Vim 常用命令简要总结
linux·编辑器·vim