Почему sed не работает с международными символами и как это исправить?

StackOverflow https://stackoverflow.com/questions/67410

Вопрос

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

Gras Och Stenar Trad - от Moja до DVD Minneapolis [G2007DVD] 7812 | Икс
Gras Och Stenar Trad - от Möja до Minneapolis DVD [G2007DVD] 7812 | У

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

И когда я это сделаю

SED 'S /.* | // 'в

Я ожидаю увидеть только x и y, так как я попросил удалить все Chars до '|' и пространство за ним.Вместо этого я получаю:

Икс
Gras Och Stenar Trad - От М?Да

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

Это было полезно?

Решение

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

Пример: 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.

Другие советы

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

perl -pe 's/.*\| //' x
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top