2008-09-15 8 views
15

GNU sed версия 4.1.5, похоже, терпит неудачу с международными символами. Вот мой входной файл:Почему sed терпит неудачу с международными символами и как исправить?

Gras Och Stenar Trad - от Moja до Minneapolis DVD [G2007DVD] 7812 | X
Gras Och Stenar Trad - от Möja до Minneapolis DVD [G2007DVD] 7812 | Y

(Примечание умляут во второй строке.)

И когда я

СЕПГ «s /.* | // '< in

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

X
Gras Och Stenar Trad - From M? Y

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

+0

Эта проблема, кажется, была решена с помощью GNU sed (проверена на версии 4.2.2). – sorontar 2016-11-23 22:36:15

ответ

24

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

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

+0

Это также работает и позволяет мне использовать sed. Благодаря! – Dave 2008-09-16 20:46:48

9

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

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

Этот подсказку очень полезен. – 2016-03-18 18:23:59

Смежные вопросы