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”:
谢谢。
该字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)
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |