Grep 获取可能的结果

Grep 获取可能的结果

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

ex****e

那么以 ex 开头、以 e 结尾、中间有 4 个字符的任何内容,我该怎么做呢?

答案1

匹配单个字符的正则表达式运算符是.。这与?shell 中的通配符类似。*本身匹配正则表达式中任意数量的前面的内容(例如,a*匹配任意数量(包括 0)的as),以及 shell 通配符中的任意数量的字符。

POSIXly,找到x与 e 完全匹配的行:

grep -xE 'ex.{4}e'

或者:

grep -x ex....e

或者:

grep -x 'ex.\{4\}e'

其中第二个是最便携的。grep '^ex....e$'甚至可以在 Unix Version 4 (1973) 的原始实现中工作;然而,-x它是在 Unix Version 7 (1979) 中添加的,并且现在已经通用,因此您可以信赖它。

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

然而,您仍然偶尔会发现一些grep不支持的实现-E,或者egrep不支持{x,y}像Solaris 的/bin/grep和的实现/bin/egrep(您需要使用它来/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

由于 ê 字符在 UTF-8 中由两个字节组成,因此extrême是 7 个字符,但却是 8 个字节:

$ printf %s extrême | wc -cm
      7       8

答案2

使用以下正则表达式:

^ex.{4}e$

前任 :

$ grep -E '^ex.{4}e$' <<< 'ex****e'

或者

$ grep '^ex.\{4\}e$' <<< 'ex****e'

输出 :

    ex****e

答案3

@stéphane-chazelas 建议的基本模式:

grep -xE 'ex.{4}e'  

将找到仅由 'e'、'x'、任何 4 个字符和 'e' 组成的行,并且由于开关 '-x' 而没有空格,相当于 @gilles-quenot 的建议

grep -E ^ex.{4}e$

然而,OP 希望“任何以 ex 开头、以 e 结尾、中间有 4 个字符的内容”,这样就可以包含不匹配内容和匹配内容的行。为了得到这个,你需要这个模式,

    grep -E 'ex.{4}e'

引号可以防止 shell 括号扩展。

相关内容