Почему sed не работает с интернациональными символами и как это исправить? - PullRequest
15 голосов
/ 16 сентября 2008

GNU sed версии 4.1.5 не работает с международными символами. Вот мой входной файл:

Грас Оч Стенар Трад - От Моджи до Миннеаполиса DVD [G2007DVD] 7812 | Икс
Gras Och Stenar Trad - От Möja до Миннеаполисского DVD [G2007DVD] 7812 | Y

(Обратите внимание на умлаут во второй строке.)

И когда я делаю

sed 's /.* | // '

Я ожидаю увидеть только X и Y, так как я просил удалить ВСЕ символы до '|' и пространство за ним. Вместо этого я получаю:

X
Грас Оч Стенар Трад - От М? Y

Я знаю, что могу использовать tr для удаления Международных символов. во-первых, но есть ли способ просто использовать sed?

Ответы [ 2 ]

24 голосов
/ 16 сентября 2008

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

Пример: in - это UTF-8

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Y
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X 
Y

UTF-8 можно смело интерпретировать как ISO-8859-1, вы получите странные символы, но кроме этого все в порядке.

Пример: in - это ISO-8859-1

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Gras Och Stenar Trad - From MöY
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X 
Y

ISO-8859-1 нельзя интерпретировать как UTF-8, декодирование входного файла завершается неудачно. Странное совпадение, вероятно, связано с тем, что sed пытается восстановиться, а не полностью потерпеть неудачу.

Ответ основан на Debian Lenny / Sid и sed 4.1.5.

9 голосов
/ 16 сентября 2008

sed не очень хорошо настроен для текста не ASCII. Однако вы можете использовать (почти) тот же код в perl и получить желаемый результат:

perl -pe 's/.*\| //' x
...