Будет ли sed (и другие) повреждать файлы не в формате ASCII? - PullRequest
3 голосов
/ 12 марта 2012

Если я напишу несколько скриптов, которые манипулируют файлами, например, выполняют поиск / замену с помощью sed, и файлы могут быть в разных кодировках, могут ли файлы быть повреждены?

Текст, который я хочу заменить, является ASCII и также встречается только в строках файлов, которые содержат только ASCII, но остальные строки содержат символы в других кодировках.

1 Ответ

5 голосов
/ 13 марта 2012

Если ваши кодировки являются однобайтовыми кодировками (например, семейство ISO-8859-n) или UTF-8, где символ новой строки такой же, как в ASCII, а символ NUL (\0) не встречается, ваша операция, скорее всего, будет работать.Если файлы используют UTF-16, он не будет (из-за NUL).Почему это должно работать для простого поиска и замены строк ASCII: мы предположили, что ваша кодировка является расширенным набором ASCII и для простого соответствия, подобного этому, sed будет в основном работать на уровне байтов и просто заменять одну последовательность байтов другой.

Но: при более сложных операциях, например, когда заменяемые или замещающие строки содержат специальные символы, ваши результаты могут отличаться.Например, акцентированные символы, которые вы вводите в командной строке, могут не соответствовать кодировке в вашем файле, если кодировка / локаль консоли отличается от кодировки файла.Это можно обойти, но это требует осторожности.

Некоторые операции в sed зависят от вашей локали, например, какие символы считаются буквенно-цифровыми.Сравните, например, следующую замену, выполненную в польском языке UTF-8 и в языке C, который использует ASCII:

$ echo "gęś gęgała" | LC_ALL=pl_PL.UTF-8 sed -e 's/[[:alnum:]]/X/g'
XXX XXXXXX
$ echo "gęś gęgała" | LC_ALL=C sed -e 's/[[:alnum:]]/X/g'
Xęś XęXXłX

Но если вы хотите заменить только буквенные строки, он работает как положено:

$ echo "gęś gęgała" | LC_ALL=pl_PL.UTF-8 sed -e 's/g/G/g'
Gęś GęGała
$ echo "gęś gęgała" | LC_ALL=C sed -e 's/g/G/g'
Gęś GęGała

Как видите, результаты отличаются, потому что акцентированные символы обрабатываются по-разному в зависимости от локали.Вкратце: замена буквенных ASCII-строк, скорее всего, будет работать нормально, более сложные операции требуют изучения и могут либо работать, либо нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...