Ubuntu下Grep正则添加字符后匹配失效问题咨询
Grep正则添加字符后无匹配的原因分析
问题场景
我在Ubuntu系统中执行以下Grep命令匹配多个文件:
LANG=en_US.UTF-8 grep -P -R -i -I -H -A1 "^name#.*?r[AÀÁÂÃÄaàáâãä]f[AÀÁÂÃÄaàáâãä][EÈÉÊËeèéêë]l s[IÌÍÎÏiìíîï]m[OÔÒÓÕÖoòóôõö].*?#.*?#.*?#.*?#.*?\$" image_args_*
原本能得到如下匹配结果:
image_args_search_134.txt:name#Rafael Simões Vieira#1767###Emerenciana Rodrigues de Oliveira image_args_search_134.txt-#bati.#134#somelinkhere.com## --
但在正则表达式的m[OÔÒÓÕÖoòóôõö]后添加[EÈÉÊËeèéêë],修改后的命令为:
LANG=en_US.UTF-8 grep -P -R -i -I -H -A1 "^name#.*?r[AÀÁÂÃÄaàáâãä]f[AÀÁÂÃÄaàáâãä][EÈÉÊËeèéêë]l s[IÌÍÎÏiìíîï]m[OÔÒÓÕÖoòóôõö][EÈÉÊËeèéêë].*?#.*?#.*?#.*?#.*?\$" image_args_*
此时没有任何匹配结果,原因如下:
核心原因
- 观察匹配到的目标文本
Rafael Simões Vieira,对应正则新增部分的位置是Simões里的õ之后,实际文本中õ后面是空格,而非你新增的[EÈÉÊËeèéêë]类字符。 - 新增的
[EÈÉÊËeèéêë]要求在m[OÔÒÓÕÖoòóôõö](对应文本里的m和õ)之后必须匹配一个E类字符,但空格不属于这类字符的任何变体,正则条件不满足,因此无匹配结果。 - 虽然命令用了
-i参数忽略大小写,但这仅影响字母的大小写匹配,空格和E类字符是完全不同的字符类型,所以新增的正则规则直接导致匹配失败。
内容的提问来源于stack exchange,提问作者Marcos Camargo
相关产品推荐
相关产品推荐

