【问题标题】:grep/regex can't find accented wordgrep/regex 找不到重音词
【发布时间】:2011-06-11 23:42:36
【问题描述】:

我正在尝试安装一个正则表达式,它可以在文件中获取一些单词,其中该单词的所有字母都与单词模式匹配。

我的问题是,正则表达式找不到重音词,但在我的文本文件中有很多重音词。

我的命令行是:

cat input/words.txt | grep '^[éra]\{1,4\}$' > output/words_era.txt
cat input/words.txt | grep '^[carroça]\{1,7\}$' > output/words_carroca.txt

文件内容为:

carroça
éra
éssa
roça
roco
rato
onça
orça
roca

我该如何解决?

【问题讨论】:

  • locale 的输出是什么? input/words.txt的编码是什么?
  • 它对我有用,但也许问题出在你的语法上:方括号用于定义字符组,所以至少第二行肯定是错误的。试试:grep '^carroça\{1,3\}$'
  • @UncleZeiv,我把正则表达式弄错了,现在我用正确的方式编辑了。
  • @ephemient,语言环境是:LANG="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_CTYPE="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8 " LC_MONETARY="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_ALL= 。输入/单词的编码是 ISO-8859-1
  • 它可能有效,但它仍然是“错误的”,因为正则表达式并没有真正说明你想要做什么。它看起来就像您在尝试匹配单词carroça,但它匹配列出的1到7个字母的任何序列。 Ziev 更短的[caroç] 确实更好。两者都将匹配carroça,也将匹配rocaorça 等,但不会匹配éssaéra。我指出这一点只是因为您似乎可能不完全清楚方括号在正则表达式中的作用。

标签: regex unicode grep cat non-ascii-characters


【解决方案1】:

我发现了一个相关的问题here 似乎有效。

因此,如果您尝试以下操作:

cat input/words.txt | LANG=C grep '^[éra]\{1,4\}$' > output/words_era.txt

这会产生你期望的结果吗?

【讨论】:

  • 很遗憾没有,输出是一样的。
  • 忘记转义 \,所以他们没有出现在帖子中
  • 在这些情况下,只需在前面添加一些空格,该行将格式化为代码,这更具可读性并且不需要转义。我在这里为你完成了这项工作
【解决方案2】:

按照@dule 所说的尝试,但使用LANG=en_US.iso88591

cat input/words.txt | LANG=en_US.iso88591 grep '^[éra]\{1,4\}$' > output/words_era.txt

【讨论】:

  • @ephemient:我使用locale -a 找到了它,并在我的机器上进行了测试,并且在复制了与教父相同的情况后它可以工作。
  • 取决于系统的设置方式(可能受到/etc/locale.gen 的影响),但命名 ISO-8859-1 语言环境在 Linux 发行版中不再常见。
  • @ephemient:我明白了;事实上,我正在开发一个非常古老的 Linux 发行版
【解决方案3】:

如果您的文件以 ISO-8859-1 编码,但您的系统区域设置为 UTF-8,这将不起作用。

要么将文件转换为 UTF-8,要么将系统区域设置更改为 ISO-8859-1。

# 在 grepping 之前从 ISO-8859-1 转换为环境语言环境 # 输出将在当前语言环境中 $ iconv -f 8859_1 输入/words.txt | grep ... # 使用 ISO-8859-1 语言环境运行 grep # 输出将采用 ISO-8859-1 编码 $ cat 输入/words.txt |环境 LC_ALL=en_US grep ...

【讨论】:

  • 老兄,第一个选项“iconv”有效。谢谢。现在的输出是 carroça roça roco orça roca car raa
【解决方案4】:

假设一切都是 UTF-8,我通常会使用类似

perl -CSAD -le 'print if /^carroça{1,3}$/' filenames

因为那时我知道它在做什么。

【讨论】:

  • cmets(最终)清楚地表明,并非所有内容都是 UTF-8。
  • @ephemient 编码的磨难似乎永无止境,不是吗?
【解决方案5】:

我的问题是,正则表达式找不到重音词,但在我的文本中 文件中有很多重音词。

我的命令行是:

cat input/words.txt | grep '^[éra]\{1,4\}$' > output/words_era.txt
cat input/words.txt | grep '^[carroça]\{1,7\}$' > output/words_carroca.txt

[...]

我该如何解决?

Grep 搜索这些文件,就好像它们是字节流(8 位字符)一样。这些字符还必须符合您当前的语言环境设置。

如果您的 words.txt 文件以 UTF-8、UTF-16 或 UTF-32 编码,情况会变得更糟。或 ISO-8859-1 (latin-1)。

要处理所有此类编码,请使用 ugrep 而不是 grep 来处理以 UTF 编码的文件并匹配 Unicode 模式:

cat input/words.txt | ugrep '^[éra]\{1,4\}$' > output/words_era.txt
cat input/words.txt | ugrep '^[carroça]\{1,7\}$' > output/words_carroca.txt

这会产生以 UTF-8 编码的输出。如果输入文件以 ISO-8859-1 编码,则使用带有选项 -QISO-8859-1 的 ugrep。但是,ugrep 输出始终是 UTF-8。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多