2016-09-15 4 views
2

Мне нужно заменить строку в текстовом файле (InputFile.txt) с помощью командного/командного сценария Windows. Я нашел следующий скрипт (replace.cmd), но это не дает мне точного результата.Найти и заменить строку в текстовом файле

InputFile.txt:

1111 aaaa 
2222 bbbb 
$cc = 3333 

Пакетный сценарий (replace.cmd), который я использую, чтобы заменить $cc = 3333 на cc = 4444 является:

@echo OFF 
setlocal enabledelayedexpansion 

set "search=$cc = 3333" 
set "replace=cc = 4444" 
set "textfile=InputFile.txt" 
set "newfile=OutputFile.txt" 
(for /f "delims=" %%i in (%textfile%) do (
    set "line=%%i" 
    setlocal enabledelayedexpansion 
    set "line=!line:%search%=%replace%!" 
    echo(!line! 
    endlocal 
))>"%newfile%" 

Вывод, что я получаю после запуска кода является:

1111 aaaa 
2222 bbbb 
3333=cc = 4444= 3333 

Это должно быть примерно так:

1111 aaaa 
2222 bbbb 
cc = 4444 
+2

Вы действительно *** используете «MS-DOS» или ссылаетесь на командную строку в Windows? –

+0

Используемый сценарий не предназначен для использования строки поиска, которая включает символ ** = **. Чтобы протестировать скрипт, замените строку поиска на «set search = 2222 bbbb» и замените как «set replace = $% RANDOM%» – Compo

+0

Можете ли вы использовать Vbscript? – Squashman

ответ

0

Нам нужен эксперт здесь! Конечно, он знает, как это сделать.

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

@echo off 

set "search=$cc = 3333" 
set "replace=cc = 4444" 
set "textfile=InputFile.txt" 
set "newfile=OutputFile.txt" 

>"%newfile%" (
    for /f "delims=" %%i in (%textfile%) do (
    if "%%i" equ "%search%" (
     echo(%replace% 
    ) else (
     echo(%%i 
    )  
) 
) 
exit/B 
1

Если вы хотите немного трюк с VBScript, как этот:

@echo off 
set "Data=some data .... $cc = 3333" 
echo The data before replacing is "%Data%" & pause 
set "String1=$cc = 3333" 
set "String2=cc = 4444" 
Call :ReplaceString "%Data%" "%String1%" "%String2%" 
echo The data after replacing is "%Data%" & pause & exit 
::************************************************************************************* 
:ReplaceString <Data> <String1> <String2> 
(
    echo Wscript.echo Replace("%~1","%~2","%~3"^) 
)>"%tmp%\%~n0.vbs" 
for /f "delims=" %%a in ('Cscript /nologo "%tmp%\%~n0.vbs"') do (set "Data=%%a") 
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs" 
exit /b 
::************************************************************************************* 

EDIT: на 15/09/2016 @ 19:30

@echo off 
Set "InputFile=%~dp0InputFile.txt" 
Set "OutputFile=%~dp0OutputFile.txt" 
set "String1=$cc = 3333" 
set "String2=cc = 4444" 
if exist "%OutputFile%" Del "%OutputFile%" 
Setlocal EnableDelayedExpansion 
for /f "delims=" %%i in ('Type "%InputFile%"') do (
    If /I "%%i" == "%String1%" (
     Call :ReplaceString "%%i" "%String1%" "%String2%" 
     echo !Data! 
     ) else (
     echo %%i 
    ) 
)>> "%OutputFile%" 
start "" "%OutputFile%" & exit 
::************************************************************************************* 
:ReplaceString <Data> <String1> <String2> 
(
    echo Wscript.echo Replace("%~1","%~2","%~3"^) 
)>"%tmp%\%~n0.vbs" 
for /f "delims=" %%a in ('Cscript /nologo "%tmp%\%~n0.vbs"') do (set "Data=%%a") 
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs" 
exit /b 
::************************************************************************************* 
0

Просто изменить свой цикл:

@echo off 

set "search=$cc = 3333" 
set "replace=cc = 4444" 
set "textfile=InputFile.txt" 
set "newfile=OutputFile.txt" 

>"%newfile%" (for /f "delims=" %%i in (%textfile%) do (
     If /I "%%i" Equ "%search%" (Echo=%replace%) Else (Echo=%%i))) 
exit/B 
Смежные вопросы