玩转shell-基础正则和扩展正则

本文详细介绍Linux下基础正则(BRE)与扩展正则(ERE)的区别与应用,涵盖元字符、非贪婪匹配、范围约束及分组匹配等核心概念,适用于grep、sed与awk等常用工具。


下面为 linux 三剑客都通用的正则,有基础正则和扩展正则,其中 grep 和 sed 需要加上 -E才能使用扩展正则,或者不用 -E,直接对扩展正则中的特殊字符加上 \进行转义也行。awk 倒是很方便,不用加 -E直接使用扩展正则

  • 基础正则中^$.*[]是元字符

  • 扩展正则中ERE: ^$.*[]+(){}?|都是元字符,比基础正则多出了+(){}?|

基础正则(BRE)

# 以什么开头,a 打头
^
^a
# 以什么结尾,a 结尾
$
a$
# 表示空行
^$
# 表示任一个字符
.
# 表示区间,匹配到含有 a c d,匹配所有数字,匹配所有大小写字母
[]
[acd]
[0-9]
[a-Z]
#匹配不在这个范围的字符,这里的 ^ 可不是打头了而是有取反的意味
[^a-z]
# 表示匹配前一个字符可出现 0 个或多个,a 出现 0 次或多次
*
ba*

扩展正则(ERE)

# 非贪婪匹配,上一个字符 a 出现或没有出现
?
ba?
# 匹配前一个字母出现一个或多个,匹配 a 出现一个或多个
+
ba+
# 分组匹配,小括号中是一个整体
()
te(s|x)t
# 范围约束,匹配 a 最少 1 次,最多连续出现 5 次,如 a,aa,aaa,aaaa,aaaaa
{}
n{1,5}
# 匹配多个表达式的任何一个,匹配 e 或 l
|
e|l

其他元字符

# 匹配一个空格
\s

# 匹配出单词
\b

# 举例,匹配出“a hello b”中的hello单词我们怎么做
# 这样写会把两边空格也输出,输出“ hello ”
\shello\s
# 这样写可以输出“hello”
\bhello\b

# 表示一个数字,等价于 [0-9]
\d
### Shell脚本中正则表达式与扩展正则表达式的区别 在Shell脚本中,正则表达式(Regular Expressions)主要用于文本匹配处理,分为**基本正则表达式(BRE, Basic Regular Expressions)****扩展正则表达式(ERE, Extended Regular Expressions)**。它们的主要区别体现在语法支持使用方式上。 #### 基本正则表达式(BRE) 基本正则表达式是传统的正则表达式语法,在 `grep` `sed` 等工具中默认使用。它支持一些基础的元字符,如 `.`、`*`、`^`、`$` `[ ]` 等。然而,一些更复杂的模式(如 `+`、`?`、`|` `()`)需要通过转义才能使用。例如,若要在 `grep` 中使用 `+` 表示“一个或多个”,需要写成 `\+` [^1]。 示例: ```bash grep 'a\+' file.txt ``` 该命令用于匹配包含一个或多个字母 `a` 的行。 #### 扩展正则表达式(ERE) 扩展正则表达式在基本正则表达式的基础上增加了对更复杂模式的支持,包括 `+`、`?`、`|` `()` 等元字符,无需转义即可直接使用。要启用扩展正则表达式,通常需要结合 `-E` 选项,例如在 `grep -E` 或 `egrep` 中使用 [^1]。 示例: ```bash grep -E 'a+' file.txt ``` 该命令与上例功能相同,但使用扩展正则表达式语法,无需转义 `+`。 #### 主要区别总结 | 特性 | 基本正则表达式(BRE) | 扩展正则表达式(ERE) | |------|------------------------|------------------------| | 支持的元字符 | 有限(如 `.`、`*`、`^`、`$`) | 更多(如 `+`、`?`、`|`、`()`) | | 使用方式 | 默认启用 | 需通过 `-E` 选项启用 | | 转义要求 | 复杂模式需转义(如 `\+`) | 复杂模式无需转义(如 `+`) | | 工具支持 | `grep`、`sed` | `grep -E`、`egrep`、`awk` | #### 示例对比 匹配包含 `apple` 或 `apples` 的行: - 使用 BRE: ```bash grep 'apples*' file.txt ``` - 使用 ERE: ```bash grep -E 'apple(s)?' file.txt ``` ERE 提供了更直观的语法,使得正则表达式的编写更加简洁易于理解。 #### 转义与引号的使用 在Shell脚本中使用正则表达式时,某些特殊字符(如 `*`、`?`、`|`)可能需要转义或使用引号包裹,以防止被Shell错误解释。例如,在 `grep -E` 中使用 `*` 作为普通字符时,可以写成 `\*` 或将整个正则表达式用单引号包裹 。 示例: ```bash grep -E '\*' file.txt ``` 或 ```bash grep -E '*|+' file.txt ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abcnull

您的打赏是我创作的动力之一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值