Задача замены строки или её части в текстовом файле в командной строке или в bat файле может быть решена различными способами, в зависимости от требований.
Варианты замены текста из командной строки
Утилита поиска и замены текста
Специализированный инструмент всегда даёт самый функциональный и быстрый для реализации способ: готовые утилиты поддерживают все кодировки файлов, имеют опции для разных вариантов замены, поддерживают регулярные выражения и не требуют отладки!
Единственная ситуация, когда вариант с готовой утилитой может не подойти – если есть непреодолимое требование не использовать нестандартные (не входящие в состав Windows) компоненты при развёртывании на большое число корпоративных компьютеров. Но такое встречается нечасто.
Поэтому применение готового, отлаженного и протестированного инструмента является предпочтительным вариантом!
Скрипт на JS или VBS
Возможности VBScript/JScript позволяют реализовать различные варианты замены, включая поддержку регулярных выражений, но всё-таки имеют ограниченные возможности: поддержку меньшего числа кодировок файлов, отсутствие массовой замены, отсутствие подкаталогов и т.д. Любое изменение необходимо отлаживать и тестировать. В общем, очередной «велосипед».
Вариант со скриптом оптимально использовать в случае, когда по каким-то причинам нельзя использовать готовую утилиту.
Bat файлы
О серьёзных возможностях программирования bat файлов говорить не приходится – собственно, bat файл потому и называется пакетным файлом, что предназначен для запуска списка команд по очереди, а не для программирования циклов и обработки переменных.
Сильные стороны bat файлов – удобная форма запуска команд по списку, простое перенаправление вывода и использование переменных окружения, но лучше в bat файлах не программировать.
Ладно раньше, когда предустановленной альтернативы не было, но сейчас, когда на всех компьютерах есть WSH с VBScript/JScript и PowerShell…
Замена текста в файле скриптом JScript
Чтобы сделать замену текста в текстовом файле, в том числе, с использованием регулярных выражений, можно использовать следующий скрипт JScript, который:
- открывает указанный текстовый файл
- читает его построчно
- для каждой строки выполняет замену по регулярному выражению
Код скрипта замены текста
// Имя файла, искомый текст и текст замены берём из аргументов
var file_name = WScript.Arguments(0);
var text_sample = WScript.Arguments(1);
var text_replace = WScript.Arguments(2);
var fso=WScript.CreateObject("Scripting.FileSystemObject");
// Переносим исходный файл во временный
var file_name_tmp = file_name+".tmp";
if (fso.FileExists(file_name_tmp))
fso.DeleteFile(file_name_tmp);
fso.MoveFile(file_name,file_name_tmp);
var fo = fso.OpenTextFile(file_name_tmp,1,false,false);
var fr = fso.OpenTextFile(file_name,2,true,false);
// Выполняем замену текста, с построчной обработкой
var re=new RegExp(text_sample);
while (!fo.AtEndOfStream) {
var line = fo.ReadLine();
var line_replace = line.replace(re,text_replace);
fr.WriteLine(line_replace);
}
fo.Close();
fr.Close();
// Удаляем временный файл
fso.DeleteFile(file_name_tmp);
Запуск скрипта замены текста
При запуске скрипта необходимо параметрами передать имя файла, строку поиска (регулярное выражение), строку замены:
cscript //nologo replace_text.js content.txt Foo Bar
Примечания к скрипту
Скрипт обрабатывает файлы в ANSI кодировке. Для Unicode файла необходимо заменить 4-й аргумент в вызовах OpenTextFile c false на true.
Поскольку обработка ведётся по строкам, то регулярные выражения сработают только в пределах одной строки.
Примеры использования скрипта replace-text-script-samples.zip
Замена текста программой nhrt
Больше возможностей и гибкости: поддержка всех кодировок файлов с автоматическим определением, пакетная обработка и многое другое в программе nhrt.