我正在尝试查找可能的匹配项,
ex****e
Run Code Online (Sandbox Code Playgroud)
因此,任何以 ex 开头和以 e 结尾且中间有 4 个字符的内容,我该怎么做?
Sté*_*las 11
匹配单个字符的正则表达式运算符是.
. 这类似于?
shell 通配符。*
本身匹配正则表达式中任意数量的前面的东西(例如,a*
匹配任意数量(包括 0)的a
s),以及 shell 通配符中任意数量的字符。
POSIXly,要找到与 e 匹配的行x
:
grep -xE 'ex.{4}e'
Run Code Online (Sandbox Code Playgroud)
或者:
grep -x ex....e
Run Code Online (Sandbox Code Playgroud)
或者:
grep -x 'ex.\{4\}e'
Run Code Online (Sandbox Code Playgroud)
其中第二个是最便携的。grep '^ex....e$'
甚至可以在 Unix Version 4 (1973) 的原始实现中工作;然而,它-x
是在 Unix 版本 7(1979 年)中添加的,现在是通用的,因此您可以信赖它。
egrep
V7 中也添加了扩展正则表达式,但最初没有{x,y}
间隔运算符。该运算符是按原样添加的\{x,y\}
,grep
但通常不会添加,egrep
因为那样会破坏向后兼容性。然而,在 90 年代初期,POSIX 引入了将功能合并到其中的-E
选项并要求它支持,现在已被弃用。grep
egrep
grep
{x,y}
egrep
不过,你还是偶尔会发现一些grep
不支持实现-E
或egrep
不支持的人{x,y}
喜欢/bin/grep
和/bin/egrep
Solaris的(如果你需要使用/usr/xpg4/bin/grep
代替)。
请注意,某些grep
实现不支持多字节,它们的正则.
表达式运算符可能会匹配多字节字符的每个字节,例如非 ASCII UTF-8 字符)。
$ $ locale charmap
UTF-8
$ echo extrême | busybox grep -x ex....e
$ echo extrême | gnu-grep -x ex....e
extrême
$ echo extrême | busybox grep -x ex.....e
extrême
Run Code Online (Sandbox Code Playgroud)
由于 ê 字符在 UTF-8 中由两个字节组成,因此extrême
是 7 个字符,但是 8 个字节:
$ printf %s extrême | wc -cm
7 8
Run Code Online (Sandbox Code Playgroud)