正则表达式 grep -r 'emm*[af].[^ta]$'

Mae*_*lPJ 4 linux grep regular-expression

1 小时前我一直在问一个关于使用 grep 命令的关于正则表达式的类似问题,如果首选的选择是在同一线程中发布,请原谅我,如果是这种情况,我下次会这样做。

它可能看起来像基本的 synthax,但我试图了解正则表达式识别模式的工作原理,我得到的结果似乎与我正在阅读的手册相矛盾(我很可能没有正确解释材料)。

文件包含以下单词列表:

mael@mael-HP:~/repertoireVide$ cat MySQLServ
remembré
emmuré
emmené
dilemmes
jumeaux
écrémage
emmena
emmailloter
flemmard
Run Code Online (Sandbox Code Playgroud)

以下命令给出了输出

mael@mael-HP:~/repertoireVide$ grep -r 'emm*[a-f].[^ta]$'
MySQLServ:remembré
MySQLServ:emmené
MySQLServ:flemmard
Run Code Online (Sandbox Code Playgroud)

我想知道为什么grep不匹配“emmailloter”这个词,因为“emmailloter”:

  1. 包含“他们”
  2. 之后在 [af] 之间包含一个字符:'a'
  3. 'i' 满足 '.' 成分
  4. 不以字符 't' 或 'a' 结尾

谢谢。

Kus*_*nda 6

该字emmailloter包含的内容远不止i由[a-f]和匹配的位之间[^ta]$。该.模式只匹配单个字符,因此如果您想在末尾emma和之间匹配多个字符r,则必须允许多个字符:

emm*[a-f]..*[^ta]$
Run Code Online (Sandbox Code Playgroud)

使用grep -E(启用扩展的正则表达式),..*可以写成.+,即“匹配至少一个字符”。该表达式..*读作“匹配一个字符,然后可能匹配更多字符”。同样,如果使用,emm*可以替换为em+,即“e后跟至少一个m” grep -E。

这将匹配字符串

blop-emmmmmmmmma-blarg-b
     ^^^^^^^^^^^^^^^^^^^
     1111111111233333334

1: emm*
2: [a-f]
3: ..*
4: [^ta]$
Run Code Online (Sandbox Code Playgroud)

(^上面字符表示的匹配部分),例如,还有emmailloter:

emmailloter
^^^^^^^^^^^
11123333334
Run Code Online (Sandbox Code Playgroud)

测试:

emm*[a-f]..*[^ta]$
Run Code Online (Sandbox Code Playgroud)

请注意,对于单词remembré,匹配将是

remembré
 ^^^^^^^
 1123334
Run Code Online (Sandbox Code Playgroud)

不是

remembré
   ^^^^^
   11234
Run Code Online (Sandbox Code Playgroud)

使用以下方法可视化匹配的一种方法sed:

blop-emmmmmmmmma-blarg-b
     ^^^^^^^^^^^^^^^^^^^
     1111111111233333334

1: emm*
2: [a-f]
3: ..*
4: [^ta]$
Run Code Online (Sandbox Code Playgroud)

这只会打印匹配的行,括号中正则表达式的每个匹配部分。这还假设您正在使用sed可用于匹配法语字符的实现,并且正确设置了语言环境环境变量来执行此操作。

将此与您的原始表达式生成的内容进行比较:

emmailloter
^^^^^^^^^^^
11123333334
Run Code Online (Sandbox Code Playgroud)