linux 中 正则表达式* 和 ?
a、
正则表达式的类型
使用正则表达式最大的问题在于有不止一种类型的正则表达式。Linux 中的不同应用程序可能会用不同类型的正则表达式。这其中包括编程语言(Java、Perl 和 Python)、Linux 实用工具(比如 sed 编辑器、gawk 程序和 grep 工具)以及主流应用(比如 MySQL 和 PostgreSQL 数据库服务器)。
正则表达式是通过正则表达式引擎
(regular expression engine)实现的。正则表达式引擎是一套底层软件,负责解释正则表达式模式并使用这些模式进行文本匹配。在 Linux 中,有两种流行的正则表达式引擎:
-
POSIX 基础正则表达式(basic regular expression,BRE)引擎
-
POSIX 扩展正则表达式(extended regular expression,ERE)引擎
大多数 Linux 工具都至少符合 POSIX BRE 引擎规范,能够识别该规范定义的所有模式符号。遗憾的是,有些工具(比如 sed 编辑器)只符合了 BRE 引擎规范的子集。这是出于速度方面的考虑导致的,因为 sed 编辑器希望能尽可能快地处理数据流中的文本。
POSIX BRE 引擎通常出现在依赖正则表达式进行文本过滤的编程语言中。它为常见模式提供了高级模式符号和特殊符号,比如匹配数字、单词以及按字母排序的字符。gawk 程序用 ERE 引擎来处理它的正则表达式模式。
由于实现正则表达式的方法太多,很难用一个简洁的描述来涵盖所有可能的正则表达式。
* 表示匹配前一个字符0次或者多次;
?表示匹配前一个字符0次或者1次, 且只在扩展正则表达式中生效。
001、
root@DESKTOP-IDT9S0E:/home/test# echo "ik" | grep "ie?k" root@DESKTOP-IDT9S0E:/home/test# echo "ik" | sed -n '/ie*k/p' ## *表示匹配0次或者多次 ik root@DESKTOP-IDT9S0E:/home/test# echo "ik" | grep "ie*k" ## *表示匹配0次或者多次 ik root@DESKTOP-IDT9S0E:/home/test# echo "ik" | grep "ie?k" root@DESKTOP-IDT9S0E:/home/test# echo "ik" | grep -E "ie?k" ## ?表示匹配0次或者1次,且扩展正则 ik
002、
root@DESKTOP-IDT9S0E:/home/test# echo "ieeeek" | sed -n '/ie*k/p' ## *号表示匹配0次或者多次 ieeeek root@DESKTOP-IDT9S0E:/home/test# echo "ieeeek" | grep "ie*k" ieeeek root@DESKTOP-IDT9S0E:/home/test# echo "ieeeek" | grep -E "ie?k" ## ?表示匹配0次或者1次 root@DESKTOP-IDT9S0E:/home/test# echo "ik" | grep -E "ie?k" ik root@DESKTOP-IDT9S0E:/home/test# echo "iek" | grep -E "ie?k" iek root@DESKTOP-IDT9S0E:/home/test# echo "ieek" | grep -E "ie?k"
003、
root@DESKTOP-IDT9S0E:/home/test# echo "baeeaeeat" | sed -n '/b[ae]*t/p' baeeaeeat root@DESKTOP-IDT9S0E:/home/test# echo "baakeeet" | sed -n '/b[ae]*t/p'
只要 a 和 e 字符以任何组合形式出现在 b 和 t 字符之间(就算完全不出现也行),模式就能够匹配。如果出现了字符组之外的字符,该模式匹配就会不成立。
来源: https://mp.weixin.qq.com/s?__biz=MzUxMjEyNDgyNw==&mid=2247513225&idx=1&sn=0b4119aa05476f6f25a1603dd0b46269&chksm=f96bc67dce1c4f6bd989697ea7d0df177e9e49377b3e5839e6902f5f0c7a9bd5de4c3f9d0a67&mpshare=1&scene=23&srcid=0510LQZpQrkaE3X3MuCgBeUT&sharer_sharetime=1683650310883&sharer_shareid=50b75c6a886e09824b582fb782a7678b#rd