[CMD] Как через ВАТ найти и заменить слова в файле

Denis2707

Постоянный участник
Сообщения
102
Реакции
3
Пример:
Запускаю батник, в батнике задаю требуемое мне число/слово (например saturn), затем в файле (например C:\qwerty.config) нужно заменить слова venera на saturn.
 
Последнее редактирование:
Вот примерный код в этих строка Вам надо заменить путь до файла и путь до временного файла
Если файл состояит только из цифр и латинских букв проблем не будет
Если есть русские буквы батник и файл в котором происходит замены должны быть одинаковой кодировки ANSI например
Код:
set "source=C:\qwerty.config"
set "dest=C:\qwerty_temp.config"


CMD/BATCH:
@echo off
chcp 1251 > nul
setlocal enabledelayedexpansion

set /p SearchWord=Введите слово для поиска:
set /p ReplaceWord=Введите слово для замены:

set "source=C:\qwerty.config"
set "dest=C:\qwerty_temp.config"

if not exist "%source%" (
    echo Файл %source% не найден.
    exit /b
)

:: Переменная для подсчета замен
set "count=0"

:: Чтение из файла, замена и запись в новый файл
for /f "tokens=*" %%a in ('type "%source%"') do (
    set "line=%%a"
    set "newline=!line:%SearchWord%=%ReplaceWord%!"
    if not "!line!"=="!newline!" (
        set /a count+=1
    )
    echo(!newline!>>"%dest%"
)

:: Перемещаем новый файл на место оригинала
move /y "%dest%" "%source%"

echo Замена завершена. Всего замен: !count!.
endlocal
 
Еще как вариант в начале кода добавить строку
Для резервного копирование файла на всякий случай

Код:
:: Создаем резервную копию оригинального файла
copy  /y "%source%" "%source%.bak"
 
И изначально ТЗ было через батник, но вдруг тоже пригодится ReplaceByRegular
 
Еще как вариант в начале кода добавить строку
Для резервного копирование файла на всякий случай

Код:
:: Создаем резервную копию оригинального файла
copy  /y "%source%" "%source%.bak"
подскажите, пожалуйста, не совсем понял, какой именно файл нужно указать в пути до временного файла?
в команде set "dest=C:\qwerty_temp.config" оставил всё как есть и работет, то есть вот так:
set "source=%USERPROFILE%\Desktop\qwerty.config"
set "dest=C:\qwerty_temp.config"

И второй вопрос, можна чтобы в новом файле отступы сохранялись как в оригинальном файле?
На фото: слева оригинал, справа после скрипта
 

Вложения

  • Screenshot 2024-04-05 123336.webp
    Screenshot 2024-04-05 123336.webp
    16.1 KB · Просмотры: 21
@
подскажите, пожалуйста, не совсем понял, какой именно файл нужно указать в пути до временного файла?
в команде set "dest=C:\qwerty_temp.config" оставил всё как есть и работет, то есть вот так:
set "source=%USERPROFILE%\Desktop\qwerty.config"
set "dest=C:\qwerty_temp.config"

И второй вопрос, можна чтобы в новом файле отступы сохранялись как в оригинальном файле?
На фото: слева оригинал, справа после скрипта
@AssistGPT, поможете решить, чтобы отступы в файле сохранялись?
 
@
подскажите, пожалуйста, не совсем понял, какой именно файл нужно указать в пути до временного файла?
в команде set "dest=C:\qwerty_temp.config" оставил всё как есть и работет, то есть вот так:
set "source=%USERPROFILE%\Desktop\qwerty.config"
set "dest=C:\qwerty_temp.config"

И второй вопрос, можна чтобы в новом файле отступы сохранялись как в оригинальном файле?
На фото: слева оригинал, справа после скрипта
@AssistGPT, поможете решить, чтобы отступы в файле сохранялись?
Для того чтобы сохранить отступы в файле при замене слов, вам нужно немного изменить скрипт. Вместо использования echo(!newline!>>"%dest%", вы можете использовать echo(!newline!. Это позволит сохранить отступы в новом файле.

Вот как будет выглядеть измененная часть скрипта:

CMD/BATCH:
:: Чтение из файла, замена и запись в новый файл
(for /f "tokens=*" %%a in ('type "%source%"') do (
    set "line=%%a"
    set "newline=!line:%SearchWord%=%ReplaceWord%!"
    if not "!line!"=="!newline!" (
        set /a count+=1
    )
    echo(!newline!
)) > "%dest%"

Этот код сохранит отступы в новом файле. Попробуйте использовать этот измененный скрипт и проверьте результат.
 
Для того чтобы сохранить отступы в файле при замене слов, вам нужно немного изменить скрипт. Вместо использования echo(!newline!>>"%dest%", вы можете использовать echo(!newline!. Это позволит сохранить отступы в новом файле.

Вот как будет выглядеть измененная часть скрипта:

CMD/BATCH:
:: Чтение из файла, замена и запись в новый файл
(for /f "tokens=*" %%a in ('type "%source%"') do (
    set "line=%%a"
    set "newline=!line:%SearchWord%=%ReplaceWord%!"
    if not "!line!"=="!newline!" (
        set /a count+=1
    )
    echo(!newline!
)) > "%dest%"

Этот код сохранит отступы в новом файле. Попробуйте использовать этот измененный скрипт и проверьте результат.
не работает, есть две проблемы: первая - отступы не сохраняються как в оригинале, вторая - в новом файле в некоторых строчках добавляеться не нужное
вот скрипт:

@echo off
chcp 1251 > nul
setlocal enabledelayedexpansion

set /p SearchWord=Enter a search word:
set /p ReplaceWord=Enter a replacement word:

set "source=%USERPROFILE%\Desktop\qwerty.config"
set "dest=%USERPROFILE%\Desktop\qwerty_temp.config"

if not exist "%source%" (
echo Файл %source% не найден.
exit /b
)

:: Переменная для подсчета замен
set "count=0"

:: Чтение из файла, замена и запись в новый файл
(for /f "tokens=*" %%a in ('type "%source%"') do (
set "line=%%a"
set "newline=!line:%SearchWord%=%ReplaceWord%!"
if not "!line!"=="!newline!" (
set /a count+=1
)
echo(!newline!
)) > "%dest%"

:: Перемещаем новый файл на место оригинала
move /y "%dest%" "%source%"

echo Замена завершена. Всего замен: !count!.
endlocal


вот пример файла оригинала:
<!--
-->
<name="qwerty.iname" value="venera" />



-->
<name="D.G.path" value="c:\" />

<!--

вот файл с результата:
<--
-->
<name="qwerty.iname" value="saturn" />
venera=saturn
venera=saturn
venera=saturn
-->
<name="D.G.path" value="c:\" />
venera=saturn
<--
venera=saturn
 
не работает, есть две проблемы: первая - отступы не сохраняються как в оригинале, вторая - в новом файле в некоторых строчках добавляеться не нужное
вот скрипт:

@echo off
chcp 1251 > nul
setlocal enabledelayedexpansion

set /p SearchWord=Enter a search word:
set /p ReplaceWord=Enter a replacement word:

set "source=%USERPROFILE%\Desktop\qwerty.config"
set "dest=%USERPROFILE%\Desktop\qwerty_temp.config"

if not exist "%source%" (
echo Файл %source% не найден.
exit /b
)

:: Переменная для подсчета замен
set "count=0"

:: Чтение из файла, замена и запись в новый файл
(for /f "tokens=*" %%a in ('type "%source%"') do (
set "line=%%a"
set "newline=!line:%SearchWord%=%ReplaceWord%!"
if not "!line!"=="!newline!" (
set /a count+=1
)
echo(!newline!
)) > "%dest%"

:: Перемещаем новый файл на место оригинала
move /y "%dest%" "%source%"

echo Замена завершена. Всего замен: !count!.
endlocal


вот пример файла оригинала:
<!--
-->
<name="qwerty.iname" value="venera" />



-->
<name="D.G.path" value="c:\" />

<!--

вот файл с результата:
<--
-->
<name="qwerty.iname" value="saturn" />
venera=saturn
venera=saturn
venera=saturn
-->
<name="D.G.path" value="c:\" />
venera=saturn
<--
venera=saturn
Для того чтобы сохранить отступы и избежать лишних замен в вашем скрипте, вам нужно внести следующие изменения:

1. Для сохранения отступов, вам нужно использовать echo без скобок и с отключенным автоматическим добавлением символа новой строки в конце строки. Это позволит сохранить отступы в новом файле.

2. Для избежания лишних замен, добавьте проверку наличия слова целиком в строке, чтобы избежать замены в случае, если искомое слово является частью другого слова.

Вот как будет выглядеть измененная часть скрипта:

CMD/BATCH:
:: Чтение из файла, замена и запись в новый файл
(for /f "tokens=*" %%a in ('type "%source%"') do (
    set "line=%%a"
    set "newline=!line:%SearchWord%=%ReplaceWord%!"
    if not "!line!"=="!newline!" (
        set /a count+=1
    )
    echo|set /p=!newline!
)) > "%dest%"

Также, для избежания лишних замен, вы можете добавить проверку наличия слова целиком в строке, используя следующий код:

CMD/BATCH:
:: Чтение из файла, замена и запись в новый файл
(for /f "tokens=*" %%a in ('type "%source%"') do (
    set "line=%%a"
    set "newline=!line:%SearchWord%=%ReplaceWord%!"
    if not "!line!"=="!newline!" (
        for /f "delims=" %%b in ('echo !line! ^| findstr /i /c:"\b%SearchWord%\b"') do (
            set /a count+=1
            echo|set /p=!newline!
        )
    ) else (
        echo|set /p=!line!
    )
)) > "%dest%"

Попробуйте использовать один из этих вариантов и проверьте результат. Они должны помочь сохранить отступы и избежать лишних замен в вашем файле.
 
@Denis2707, не мучайте дальше бота. Его пример не будет работать ни в каком виде для указанного вами содержимого.
Воспользуйтесь
И изначально ТЗ было через батник, но вдруг тоже пригодится ReplaceByRegular
там все настройки задаются элементарно. Его можно запустить в т.ч. из-под батника в автоматическом режиме.
 
@Denis2707, не мучайте дальше бота. Его пример не будет работать ни в каком виде для указанного вами содержимого.
Воспользуйтесь

там все настройки задаются элементарно. Его можно запустить в т.ч. из-под батника в автоматическом режиме.
А мне как то бот предложил батником прочитать файл в переменную, в ней заменить "венерьі на сатурньі", а затем записать полученную переменную в новьій файл.
 
@Сергій, это не невозможно, но стоит ли овчинка выделки? Батником будет медленно. Для таких задач юзайте Powershell, что угодно другое, только не это. Потом еще появится задача использовать другую кодировку... переделывать все с нуля?
 
Назад
Сверху Снизу