Если ваши кодировки являются однобайтовыми кодировками (например, семейство 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-строк, скорее всего, будет работать нормально, более сложные операции требуют изучения и могут либо работать, либо нет.