Linux 正则表达式教程:Grep Regex 示例

⚡ 智能摘要

Linux 正则表达式是特殊的字符序列,它使用基本形式、区间形式、扩展形式和括号扩展形式,在 grep、sed 和 vi 等工具中搜索数据并匹配复杂的模式,从而精确地过滤文本。

  • 🔎 它们是什么: 正则表达式(简称 regexp 或 regex)用于描述文本模式,以便进行搜索和匹配。
  • 🧩 基本套装: 诸如 . ^ $ * 和 \ 之类的符号用于在模式中锚定、重复和转义字符。
  • 🔢 间隔: 诸如 {n} 和 {n,m} 之类的花括号控制前面的字符重复的次数。
  • ➕ 扩展: 使用 grep -E,\+ 和 \? 分别匹配一个或多个和零个或一个字符。
  • 🧵 支架扩张: 花括号可以从序列或逗号分隔的列表中生成多个字符串。
  • 🛠️ 使用范围: grep、sed、tr 和 vi 等工具都依赖正则表达式来过滤文本。
  • 🤖 人工智能帮助: AI 助手和 GitHub Copilot 可以快速生成、解释和调试正则表达式模式。

Linux 系统中使用 grep 命令的正则表达式——基本正则表达式、区间正则表达式和扩展正则表达式示例

正则表达式是编程语言中最强大的功能之一。 Linux 文本工具,让您能够使用简洁的模式匹配、筛选和转换数据。本页解释了基本形式、区间形式和扩展形式,以及花括号扩展,并提供了 grep 示例。

什么是 Linux 正则表达式?

Linux 正则表达式是用于搜索数据和匹配复杂模式的特殊字符。正则表达式简写为“regexp”或“regex”。它们被广泛应用于许多 Linux 程序中,例如: grep的bash、rename、sed 等。

正则表达式的类型

为了便于理解,让我们逐一学习不同类型的正则表达式。本页涵盖基本正则表达式、区间正则表达式和扩展正则表达式,最后介绍大括号扩展。

基本正则表达式

一些常用的可与正则表达式配合使用的命令包括 tr、sed 等。 vi以及 grep。下表列出了一些基本的正则表达式。

图形符号 描述
. 替换任何字符
^ 匹配字符串的开头
$ 匹配字符串的结尾
* 匹配零次或多次前一个字符
\ 代表特殊字符
() 组正则表达式
? 匹配一个字符

我们来看一个例子。首先,运行 cat sample 命令来显示现有文件的内容,如下所示。

cat 示例命令显示终端中现有文件的内容

接下来,搜索包含字母“a”的内容。下面的屏幕截图显示 grep 命令返回了所有包含“a”的行。

使用 grep 命令搜索示例文件中包含字母 a 的行。

插入符号“^”用于匹配字符串的开头。以下示例搜索以字母“a”开头的内容。

使用插入符号作为锚点,仅匹配以字母 a 开头的行。

仅筛选以特定字符开头的行。不以字符“a”开头的行将被忽略。

我们来看另一个例子。下面的截图再次显示了按行尾过滤之前的示例文件内容。

示例文件内容在过滤掉以字母 t 结尾的行之前显示。

使用“$”锚点选择以字母“t”结尾的行,如下所示。

使用以美元符号为锚点的 grep 命令,仅选择以字母 t 结尾的行。

区间正则表达式

这些表达式用于指定字符串中某个字符出现的次数。它们列在下面。

口语 描述
{不是} 匹配恰好出现 'n' 次的前一个字符
{n,m} 匹配出现 'n' 次但不超过 m 次的前一个字符
{n, } 仅当前方字符出现 'n' 次或更多时才匹配

例如,筛选出所有包含字符“p”的行。下面的屏幕截图显示了匹配的行。

使用 grep 命令过滤样本文件,查找包含字符 p 的行。

现在检查字符“p”是否在字符串中连续出现两次。语法如下:

cat sample | grep -E p\{2}

区间匹配结果如下所示。

grep -E 区间表达式,匹配出现两次的字符 p

注意:您需要在这些正则表达式中添加 -E。

扩展正则表达式

这些正则表达式组合了多个表达式。其中一些是:

口语 描述
\+ 匹配前一个字符的一个或多个出现
\? 匹配前一个字符零次或一次

例如,搜索所有出现字符“t”的项。下面的屏幕截图显示了结果。

使用 grep 命令搜索示例文件,查找所有包含字符“t”的行。

假设你想筛选出字符“a”位于字符“t”之前的行。你可以使用类似下面的命令:

cat sample|grep "a\+t"

输出结果如下图所示。

grep 扩展表达式匹配一个或多个 a 字符后跟 t。

括号扩展

花括号展开的语法可以是花括号“{}”内的序列或以逗号分隔的项列表。序列中的起始项和结束项之间用两个句点“..”分隔。

下面列出一些示例。

使用花括号扩展的 echo 命令,可以从序列和列表中生成多个字符串。

在上面的示例中,echo 命令使用花括号扩展创建字符串,从单个模式生成多个字符串。

常见问题

grep 默认使用基本正则表达式。egrep 启用扩展表达式(与 grep -E 相同),而 fgrep 匹配固定字符串,不使用正则表达式(grep -F)。现代 GNU grep 已将 egrep 和 fgrep 标记为已弃用,因此建议使用 grep -E 和 grep -F。

字符类匹配特定类别的字符。例如,方括号表达式 [az] 匹配一个字符范围,而 POSIX 类(例如 [[:alpha:]]、[[:digit:]] 和 [[:space:]])分别匹配字母、数字和空格。它们确保模式在不同区域设置中具有可读性和可移植性。

添加 `-i` 选项,例如 `grep -i “hello” sample`。这将匹配 Hello、HELLO 和 hello 这三个字符。如果没有 `-i` 选项,正则表达式区分大小写,因此大写字母和小写字母会被视为两个不同的字符。

Shell 通配符(globbing)用于扩展文件名,其中 * 表示任意字符,? 表示一个字符。正则表达式用于匹配文件中的文本,其中 * 表示零个或多个前面的字符。相同的符号在不同的上下文中代表不同的含义。

使用 -o 选项,例如 grep -o “a\+t” sample。grep 不会打印整行,而是只打印与模式匹配的部分,每行一个匹配项。这在例如trac诸如电子邮件或电话号码之类的值。

使用竖线符号进行交替匹配。在扩展模式下,`grep -E “cat|dog” sample` 匹配包含 `cat` 或 `dog` 的行。在基本模式下,必须使用转义符,例如 `grep “cat\|dog” sample`。交替匹配允许一个命令同时搜索多个模式。

人工智能助手可以将简单的英文描述转换成有效的正则表达式,解释晦涩难懂的模式的作用,并在匹配失败时提供修复建议。机器学习工具还能检测大型日志文件中反复出现的模式,而手动记录这些模式将非常繁琐。

是的。 GitHub 副驾驶 它会根据你输入的注释或部分模式,直接建议 grep 命令和正则表达式。这可以加快编写复杂表达式的速度,但你应该在使用任何生成的模式之前,先用真实样本数据进行测试。

总结一下这篇文章: