提问人:Marcos Camargo 提问时间:3/21/2023 最后编辑:Marcos Camargo 更新时间:3/23/2023 访问量:92
在运算符末尾添加额外字符时,Grep 不起作用
Grep doesn't work when adding an extra character at the end of operator
问:
我正在使用此命令 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_*
然后我什么也没得到。
为什么? 谢谢!
答:
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}$' *
评论
$
\