我正在尝试 grep 查找可能的匹配项,
ex****e
那么以 ex 开头、以 e 结尾、中间有 4 个字符的任何内容,我该怎么做呢?
答案1
匹配单个字符的正则表达式运算符是.
。这与?
shell 中的通配符类似。*
本身匹配正则表达式中任意数量的前面的内容(例如,a*
匹配任意数量(包括 0)的a
s),以及 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) 中添加的,并且现在已经通用,因此您可以信赖它。
egrep
V7 中也添加了扩展正则表达式,但最初没有{x,y}
间隔运算符。该运算符\{x,y\}
已添加,grep
但通常不会添加,egrep
因为这会破坏向后兼容性。然而,在九十年代初,POSIX 引入了将功能合并到的-E
选项,并需要它的支持,但现在已被弃用。grep
egrep
grep
{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 括号扩展。