Created
May 6, 2010 20:56
-
-
Save while0pass/392696 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Перкодировка большого числа файлов из cp1251 в UTF-8 | |
==================================================== | |
Полное условие задачи: | |
* Смена кодировки текстового файла с cp1251 на UTF-8 | |
* Последняя строка обязательно должна завершаться символом конца строки | |
* В качестве символа конца строки должны выступать CR + LF, как в DOS | |
Решение с помощью редактора Vim: | |
# В редакторе меняем текущую директорию, на каталог с файлами, которые надо | |
# перекодировать. | |
:cd /path/to/dir/with/files/ | |
# Используя wildcards описываем класс файлов из нашего каталога, которые нам | |
# надо открыть, и добавляем этот класс в список аргументов Vim. Практически это | |
# значит, что все файлы будут считаны в отдельные буферы Vim, а для первого из | |
# них ещё будет открыто окно Vim для возможности его редактирования. | |
:args *.txt | |
# Далее, выполняем набор следующих комманд. | |
:argdo e ++nobin ++enc=cp1251 | set eol fenc=utf-8 ft=dos | update | |
# ``:argdo`` выполняет стоящую далее через пробел строку с командами для всех | |
# прежде открытых нами аргументов Vim. | |
# | |
# ``e ++nobin ++enc=cp1251`` открывает заново каждый аргумент в текстовом | |
# недвоичном режиме (``++nobin`` в общем-то ненужная перестраховка) с | |
# использованием кодировки cp1251. После этого идет разделитель комманд "|". | |
# Перед ним обязательно в данном случае должен быть пробел, иначе команда | |
# ``e[dit]`` получит неправильное имя кодировки "cp1251|", а дальнейшие слова | |
# set, eol и т.п. будет воспринимать как обозначения имен файлов. В итоге, она | |
# вместо того, чтобы повторно открыть файл, связанный с текущим буфером, будет | |
# пытаться открыть файл set и ещё может выдать ошибку, что может открывать | |
# только один файл, а не несколько. | |
# | |
# ``set eol`` или ``set endofline`` гарантирует, что в файле при записи | |
# последняя строка обязательно будет кончаться символ конца строки. | |
# Противополжная команда здесь -- ``set noeol``. | |
# | |
# ``set fenc=utf-8`` или ``set fileencoding=utf-8`` гарантирует, что при записи | |
# файла будет использована кодировка UTF-8. | |
# | |
# ``set ft=dos`` или ``set filetype=dos`` определяет, что при записи в качестве | |
# символов конца строки будет использована последовательность \r\n = CR + LF = | |
# 0x0D + 0x0A = chr(13) + chr(10). | |
# | |
# Все три опции объединены через пробел после одной команды ``set``. Команда | |
# ``update`` гарантирует, что файл будет сохранен только если в нем есть | |
# изменения. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Global replacement in a bunch of files in Vim: | |
:args *.[ch] | |
:argdo %s/\<my_foo\>/My_Foo/ge | update | |
This changes the word "my_foo" to "My_Foo" in all *.c and *.h files. The "e" | |
flag is used for the ":substitute" command to avoid an error for files where | |
"my_foo" isn't used. ":update" writes the file only if changes were made. | |
*list-repeat* | |
:bufdo[!] {cmd} | |
:windo {cmd} | |
:tabd[o] {cmd} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment