Почему sed терпит неудачу с международными символами и как исправить?
GNU sed версии 4.1.5, похоже, терпит неудачу с международными символами. Вот мой входной файл:
Грас Ох Стенар Трад - от Мои до Миннеаполиса DVD [G2007DVD] 7812 | Икс
Gras Och Stenar Trad - от Möja до Minneapolis DVD [G2007DVD] 7812 | У
(Обратите внимание на умляут во второй строке.)
И когда я делаю
sed '/.* |//'< в
Я ожидал бы увидеть только X и Y, так как я попросил удалить ВСЕ символы до '|' и пространство за его пределами. Вместо этого я получаю:
X
Gras Och Stenar Trad - от M? У
Я знаю, что могу использовать tr для удаления международных символов. во-первых, но есть ли способ использовать sed?
Ответы
Ответ 1
Я думаю, что ошибка возникает, если входная кодировка файла отличается от предпочтительной кодировки вашей среды.
Пример: 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.
Ответ 2
sed
не очень хорошо настроен для текста, отличного от ASCII. Однако вы можете использовать (почти) тот же код в perl
и получить желаемый результат:
perl -pe 's/.*\| //' x