И GNU, и BSD sed
поддерживают многобайтность -в соответствующих локалях, а командаy
аналогичнаtr
:
$ echo hello | sed -e 'y/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
hello
Это должно работать в большинстве мест, где вы, вероятно, будете его запускать, если ваша локаль — UTF -8.
Проблема Perl не так проста, как обработка многобайтовых символов как байтов. Он прекрасно понимает ваш ввод и даже кодирует вывод, это исходный код , который он не понимает:
$ echo abc | perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'|hexdump -C
00000000 c3 af c2 bd c2 81 0a |.......|
Кодировка UTF -8 для «a» — это ef bd 81
, поэтому вы можете видеть, что он обрабатывает «b» как второй байт, а затем искажает его, пытаясь закодировать на выходе, и то же самое для "с". Вам необходимо use utf8
чтобы исходный код Perl (5 )был закодирован таким образом ; -C
управляет вводом-выводом только во время работы программы.
Вы можете ввести use utf8;
в строку -e
или использовать -Mutf8
в командной строке:
$ echo abc | perl -C -Mutf8 -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
abc
Perl 6 действительно решает эту проблему, как и многие другие, но...
Спасибо тем, кто прокомментировал, в дополнение к исправлению не -ASCII-кавычки, вот рабочая команда:
sed -n -e '1,\|^//REPLACE TEST$|{ p; d; }' \
-e 'r replacement_file.txt' \
-e 'q' original_file.txt > original_file.txt.new && mv original_file.txt.new original_file.txt