带有正则表达式的 grep 错误地选择了 unicode 字符

问题描述 投票:0回答:1

我使用以下正则表达式运行 grep:

cat file.txt | grep -e "^[a-zA-Z]"

重点是只获取以 ascii 范围内的字母字符开头的行,如果我明确地输入字母表,那么这是有效的

cat file.txt | grep -e "^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]"

这已经很奇怪了,因为这就是

[a-zA-Z]
应该指定的内容。当我查看输入数据与第一个正则表达式的匹配时,我们得到如下匹配:

🅱

请注意,在这些情况下,fi 和 fl 是一个字符。

从技术上讲,显式输入字母表是一个解决方案,但我宁愿

  • 知道为什么
    [a-zA-Z]
    不起作用
  • 如果存在合理的解决方案,看看它会是什么样子。
regex unix unicode grep
1个回答
0
投票

grep 是区域设置感知的。

[a-zA-Z]
可以匹配非 ASCII 字符,具体取决于您的区域设置(例如 á、ä、ø、æ)。要强制使用 ASCII(并且不处理任何多字节字符),请设置 C 区域设置:

LC_ALL=C grep -e "^[a-zA-Z]" file.txt
© www.soinside.com 2019 - 2024. All rights reserved.