在运算符末尾添加额外字符时,Grep 不起作用

Grep doesn't work when adding an extra character at the end of operator

提问人:Marcos Camargo 提问时间:3/21/2023 最后编辑:Marcos Camargo 更新时间:3/23/2023 访问量:92

问:

我正在使用此命令 grepping (Ubuntu) 多个文件:

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##
--

但是,如果我将 [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_*

然后我什么也没得到。

为什么? 谢谢!

Ubuntu grep

评论

0赞 Cyrus 3/21/2023
如果可能的话,我建议改用单引号。
0赞 Marcos Camargo 3/21/2023
如果我用单引号替换双引号,那么它在这两种情况下都不起作用。
0赞 Ed Morton 3/21/2023
你的正则表达式应该是文字还是字符串末尾的正则表达式 metachar?如果是后者,请从它前面取下。$\
0赞 Marcos Camargo 3/21/2023
它应该意味着字符串的末尾。我删除了 \ 但仍然不起作用。同样的命令适用于我的iPage网站。我正在将其迁移到 Google Cloud Compute,这就是我看到这个问题的地方。
0赞 Marcos Camargo 3/22/2023
如果您将其回显到文件:name#Rafael Simões Vieira#1763### 然后尝试 grep 它,则不起作用。

答:

0赞 dodrg 3/23/2023 #1

如果我使用一些未安装的区域设置,我只看到您的问题。

请验证所需的语言环境是否已激活(未被领导推荐#)

grep "en_US" /etc/locales.gen

# en_US ISO-8859-1
# en_US.ISO-8859-15 ISO-8859-15
en_US.UTF-8 UTF-8

(可以通过删除注释来根据您的需要配置文件。/etc/locales.gen#)

确保这些配置的区域设置是真正生成的:

sudo update-locale

评论

0赞 Marcos Camargo 3/23/2023
我找不到文件“/etc/locales.gen”。如何生成此文件?我发出了命令“sudo apt install locales-all”,它现在可以工作了。我觉得我有比我需要的更多的区域设置,所以我想删除除en_US之外的所有不必要的区域设置。UTF-8 格式。我该怎么做?当我发出命令“localectl list-locales”时,我看到一长串我不需要的语言环境。
0赞 Marcos Camargo 3/23/2023
我必须通过发出命令“sudo apt-get install locales”来创建 /etc/locales.gen 文件。然后我按照您的指示编辑了文件“/etc/locales.gen”。现在它正在工作。
1赞 kvantour 3/23/2023 #2

据我所知,您似乎想使用适合给定字母的所有可能的变音符号。在正则表达式的概念中,可以使用等价类

等价类表达式应表示属于等价类的排序规则元素集,如排序规则顺序中所述。只承认初级等效类。该类应通过将等价类中的任何一个排序元素括在括号等于 ( 和 ) 的分隔符内来表示。例如,如果 'a'、'à' 和 'â' 属于同一个等价类,则 、 和 都等价于 。如果排序单元不属于等价类,则应将等价类表达式视为排序符号。[==][[=a=]b][[=à=]b][[=â=]b][aàâb]

因此,您可能希望根据以下条件编写内容:

$ grep -i 'r[[=a=]]f[[=a=]][[=e=]]l s[[=i=]]m[[=o=]][[=e=]]s' file1 file2 file3

请注意,这在 PCRE 中不存在,因此您只需要使用扩展的正则表达式:

$ grep -A1 -iIREH '^name#[^#]*r[[=a=]]f[[=a=]][[=e=]]l s[[=i=]]m[[=o=]][[=e=]]s[^#]*(#[^#]*){4}$' *