我正在尝试安装一个正则表达式,在文件中获取一些单词,此单词的所有字母都与单词模式匹配。
我的问题是,正则表达式找不到重音词,但在我的文本文件中有很多重音词。
我的命令行是:
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
我该如何解决?
答案 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。