Задача замены строки или её части в текстовом файле в командной строке или в 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. С файлами в кодировке OEM или UTF-8 этот скрипт работать не может.
Поскольку обработка ведётся по строкам, то регулярные выражения сработают только в пределах одной строки.
Примеры использования скрипта replace-text-script-samples.zip
Замена текста программой nhrt
Больше возможностей и гибкости: поддержка всех кодировок файлов с автоматическим определением, пакетная обработка и многое другое в программе nhrt.