Grep 可能的结果

uni*_*uni 2 grep

我正在尝试查找可能的匹配项,

ex****e
Run Code Online (Sandbox Code Playgroud)

因此,任何以 ex 开头和以 e 结尾且中间有 4 个字符的内容,我该怎么做?

Sté*_*las 11

匹配单个字符的正则表达式运算符是.. 这类似于?shell 通配符。*本身匹配正则表达式中任意数量的前面的东西(例如,a*匹配任意数量(包括 0)的as),以及 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 年)中添加的,现在是通用的,因此您可以信赖它。

egrepV7 中也添加了扩展正则表达式,但最初没有{x,y}间隔运算符。该运算符是按原样添加的\{x,y\}grep但通常不会添加,egrep因为那样会破坏向后兼容性。然而,在 90 年代初期,POSIX 引入了将功能合并到其中的-E选项并要求它支持,现在已被弃用。grepegrepgrep{x,y}egrep

不过,你还是偶尔会发现一些grep不支持实现-Eegrep不支持的人{x,y}喜欢/bin/grep/bin/egrepSolaris的(如果你需要使用/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)