grep / regex找不到重音词

时间:2011-01-19 19:02:18

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

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

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

我的命令行是:

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

我该如何解决?

5 个答案:

答案 0 :(得分:8)

如果您的文件是用ISO-8859-1编码的,但系统区域设置是UTF-8,则无法使用。

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

# convert from ISO-8859-1 to the environmental locale before grepping
# output will be in the current locale
$ iconv -f 8859_1 input/words.txt | grep ...

# run grep with an ISO-8859-1 locale
# output will be in ISO-8859-1 encoding
$ cat input/words.txt | env LC_ALL=en_US grep ...

答案 1 :(得分:1)

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

所以,如果你尝试类似的东西:

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

这会产生你期望的吗?

答案 2 :(得分:1)

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

这样的东西
perl -CSAD -le 'print if /^carroça{1,3}$/' filenames

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

答案 3 :(得分:0)

尝试@dule说,但LANG=en_US.iso88591

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

答案 4 :(得分:0)

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

我的命令行是:

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编码的,则将ugrep与选项-QISO-8859-1一起使用。 ugrep输出始终为UTF-8。