Сопоставление определенной строки, начинающейся с двойной косой черты, с помощью sed

И 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 действительно решает эту проблему, как и многие другие, но...

1
31.03.2020, 03:09
1 ответ

Спасибо тем, кто прокомментировал, в дополнение к исправлению не -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
1
19.03.2021, 02:31

Теги

Похожие вопросы