grep / regex не может найти акцентированное слово - PullRequest
4 голосов
/ 19 января 2011

Я пытаюсь смонтировать регулярное выражение, в котором есть несколько слов в файле, где все буквы этого слова совпадают с шаблоном слов.

Моя проблема в том, что регулярное выражение не может найти акцентированные слова, но в моем текстовом файле много акцентированных слов.

Моя командная строка:

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

Как я могу это исправить?

Ответы [ 4 ]

8 голосов
/ 19 января 2011

Если ваш файл закодирован в ISO-8859-1, но системная локаль UTF-8, это не будет работать.

Либо конвертируйте файл в UTF-8, либо измените системную локаль на ISO8859-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 голос
/ 20 января 2011

Предполагая, что все в UTF-8, я обычно просто использую что-то вроде

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

потому что тогда я знаю, что он делает.

1 голос
/ 19 января 2011

Я нашел связанный вопрос здесь , который, кажется, работает.

Так что, если вы попробуете что-то вроде:

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

Это производит то, что вы ожидаете?

0 голосов
/ 19 января 2011

Попробуйте, как сказал @dule, но с LANG=en_US.iso88591:

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