Назад | Перейти на главную страницу

проблема с выполнением сценария bash с кодировкой utf8

У меня есть сценарий bash, закодированный в utf8.

В сценарии я использую команду sed, используя § как разделитель.

Теперь, когда я запускаю, выполните этот скрипт sed жалуется на разделитель.

Если я использую обычный символ в качестве разделителя для ex @ тогда все работает.

Я просмотрел сценарий в замазке [установить utf8 в замазке], и персонаж выглядит нормально.

Также набор символов Linux по умолчанию из locale команда показывает

 LC_CSET=en_US.UTF-8 

Что могло пойти не так?

Раньше я использовал кодировку windows-1252 для сценариев оболочки, и это работало.

Наверное, ваша версия sed не поддерживает многобайтовые символы-разделители. Если вы посмотрите на путь § кодируется двумя наборами символов, вы увидите разницу:

% locale
LANG="en_CA.UTF-8"
LC_COLLATE="en_CA.UTF-8"
LC_CTYPE="en_CA.UTF-8"
LC_MESSAGES="en_CA.UTF-8"
LC_MONETARY="en_CA.UTF-8"
LC_NUMERIC="en_CA.UTF-8"
LC_TIME="en_CA.UTF-8"
LC_ALL=
% printf § > section.utf8
% hexdump -C section.utf8
00000000  c2 a7                                             |..|
00000002
% iconv -f UTF-8 -t WINDOWS-1252 < section.utf8 > section.win1252
% hexdump -C section.win1252
00000000  a7                                                |.|
00000001

Различные версии sed даст вам более или менее полезные сообщения. В моей системе OS X 10.6 я получаю несколько загадочную информацию:

% sed 's§foo§bar§' 
sed: 1: "s§foo§bar§": RE error: illegal byte sequence

Версия sed что Ubuntu 10.04 LTS более полезно:

% sed 's§foo§bar§'
sed: -e expression #1, char 2: delimiter character is not a single-byte character