1

Тема: CMD/BAT: Замена одной строки на другую в txt файле

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

Нужно, что бы при нажатии на батник в файле MYFILE.TXT, который состоит из не более чем 100 строк, строка FA_ALERT=1 заменялась на строку FA_ALERT=0, желательно что бы при этом ненужно было указывать номер этой строки.

Заранее спасибо всем откликнувшимся.

2

Re: CMD/BAT: Замена одной строки на другую в txt файле

for %%x ... do (
for %%y in (%%x) do (
set z=%%y
if !z!==FA_ALERT=1 set !z!=FA_ALERT=0
set zz=!zz!!z!тутапробел
)
echo !zz!
)

как то так

Я конечно далек от мысли... (с)

3

Re: CMD/BAT: Замена одной строки на другую в txt файле

Большое спасибо, я так понял это то что будет происходить с самим файлом, а как указать что бы этот скрипт применялся к конкретному файлу (путь как указать?) Просто так попробовал включить такой батник, он несработал.

4

Re: CMD/BAT: Замена одной строки на другую в txt файле

это не батник, это эскиз

Я конечно далек от мысли... (с)

5

Re: CMD/BAT: Замена одной строки на другую в txt файле

это рабочий батник. 
Запускать myfile.bat targetfile.txt

@ECHO OFF
setlocal enabledelayedexpansion
SET ifile=%1
SET tfile=%ifile%.tmp
SET find=FA_ALERT=1
SET replace=FA_ALERT=0
IF EXIST %tfile% DEL /Q %tfile%

FOR /F "tokens=* delims=, " %%a IN (%ifile%) DO ( 
    set line=%%a
    IF !line!==%find% ( SET line=%replace% )
    echo !line! >> %tfile%
)

MOVE /Y %tfile% %ifile%

EXIT /B 0

PS:
Есть в нем недостаток, после прохода по файлу данный скрипт добавляет два лишних пробела в конец каждой строки. Следовательно обработать один и тот же файл дважды не получиться так как строка %finde% не будет совпадать со строкой у которой в конце пробелы. Кто знает как вылечить это?
PSS: более простой вариант был бы с использованием %PATH:str1=str2% только вот беда, если в str1 или str2 есть знак равно как в данном случае то все летит в чертям, кто знает как лечить?
Взять строку в кавычки не предлагать так как в рамках данной задачи это не вариант.

6 (изменено: Rumata, 2012-08-10 11:19:00)

Re: CMD/BAT: Замена одной строки на другую в txt файле

MegaScrew пишет:

Есть в нем недостаток, после прохода по файлу данный скрипт добавляет два лишних пробела в конец каждой строки.

Замените

echo !line! >> %tfile%

на

echo !line!>> %tfile%

========
Вообще, лучше делать один централизованный вывод. Мне известны два способа:

1. группировка

(
    echo string
    echo another string
) > filename

2. вызов подпрограммы

call :sub > filename

:: выход из скрипта
goto :EOF

:sub
echo string
echo another string

:: выход из подпрограммы
goto :EOF
( 2 * b ) || ! ( 2 * b )

7

Re: CMD/BAT: Замена одной строки на другую в txt файле

И:

    IF !line!==%find% ( SET line=%replace% )

на:

    IF !line!==%find% ( SET line=%replace%)

. Начинаю понимать, почему рекомендуют использовать такую форму:

set "Var=Value"

Мне-то, в Far Manager'е, все пробельные символы видны.

8

Re: CMD/BAT: Замена одной строки на другую в txt файле

Rumata и alexii, спасибо за инфу.
так я тоже в FAR-e, собственно в нем и увидел лишние пробелы в итоговом файле.
А что скажете по второму вопросу про %PATH:str1=str2% ??

9

Re: CMD/BAT: Замена одной строки на другую в txt файле

MegaScrew пишет:

по второму вопросу про %PATH:str1=str2% ??

@echo off

set XYZ=VAR=VALUE

echo %XYZ%

set XYZ=%XYZ:VAR=KEY%

echo %XYZ%
( 2 * b ) || ! ( 2 * b )

10

Re: CMD/BAT: Замена одной строки на другую в txt файле

Rumata, ваш пример работает, но если его подвести под указанную тут задачу то не работает.
Нерабочий код:

@echo off

set XYZ=FA_ALERT=1
SET find=FA_ALERT=1
SET replace=FA_ALERT=0


echo %XYZ%

set XYZ=%XYZ:%find%=%replace%%

echo %XYZ%

Так как после подстановки %find% cmd не смотрит дальше. Так это обойти что бы все заработало?

11 (изменено: Rumata, 2012-08-10 15:38:03)

Re: CMD/BAT: Замена одной строки на другую в txt файле

MegaScrew пишет:

Так это обойти что бы все заработало?

Скорее всего никак.

Лично я использую утилиты SED, AWK из комплекта UnixUtils или PERL; или же пишу небольшой скрипт на JSCRIPT и внедряю его в BAT-файл, как это описано здесь - bat+jscript: два в одном

Ваша задача очень легко решается в 1-2 строки с помощью SED/AWK/PERL и требует больших усилий в командной строке DOS.

( 2 * b ) || ! ( 2 * b )

12

Re: CMD/BAT: Замена одной строки на другую в txt файле

Я бы хотел добавить от себя вопрос.
Суть такая же.
Есть файл INF.DAT
В нём есть строка, начинающаяся на origin, после идёт
= значение.
Необходимо значение, какое оно бы не было, заменить на 0.
Файл находиться в сети, на одной и той же машине. например \\Andrey\prepare\
После prepare могут быть ещё папки. INF.DAT есть всегда и, внутри оного, origin = значение, тоже.

13 (изменено: digreesun, 2012-10-02 21:28:19)

Re: CMD/BAT: Замена одной строки на другую в txt файле

MegaScrew пишет:

Rumata, ваш пример работает, но если его подвести под указанную тут задачу то не работает.
Нерабочий код:

@echo off

set XYZ=FA_ALERT=1
SET find=FA_ALERT=1
SET replace=FA_ALERT=0


echo %XYZ%

set XYZ=%XYZ:%find%=%replace%%

echo %XYZ%

Так как после подстановки %find% cmd не смотрит дальше. Так это обойти что бы все заработало?

Можно! Например вот так:

@echo off

call :MaskEQ VAR "==!=="
echo.%VAR%
rem Now VAR contains string in HEX: 1E 1E 21 1E 1E

call :RestEQ VAR "%VAR%"
echo.%VAR%
rem Now VAR restored to: ==!==

exit /b

:MaskEQ
rem call :MaskEQ VAR "%STR%"
setlocal EnableExtensions
set STR=%~2
if not defined STR goto _exit_MaskEQ
rem mask ! char to 0x1d before EnableDelayedExpansion
set STR=%STR:!=1d%
set i=0
setlocal EnableDelayedExpansion
:_next_MaskEQ
set C=!STR:~%i%,1!
if not defined C goto _ret_MaskEQ
set C=%C:"=%
set /a j=%i%+1
rem replace = char to pattern 0x1e
if "%C%"=="=" set STR=!STR:~0,%i%!1e!STR:~%j%!
set /a i=%i%+1
goto _next_MaskEQ
:_ret_MaskEQ
endlocal&set STR=%STR%
rem restore ! char from 0x1d
set STR=%STR:1d=!%
:_exit_MaskEQ
endlocal&set %1=%STR%
goto :EOF


:RestEQ
rem call :RestEQ VAR "%STR%"
setlocal EnableExtensions
set STR=%~2

rem restore = char from 0x1e
if defined STR set STR=%STR:1e==%
endlocal&set %1=%STR%
goto :EOF

P.S.
Вместо нечитабельных символов 0x1D и 0x1E можно задать любую уникальную строку
Всех благ!

там где   style="color: #448888;"> это не мое это лишнее ну кто знает поймет

Вот без подсветки синтаксиса:

@echo off

call :MaskEQ VAR "==!=="
echo.%VAR%
rem Now VAR contains string in HEX: 1E 1E 21 1E 1E

call :RestEQ VAR "%VAR%"
echo.%VAR%
rem Now VAR restored to: ==!==

exit /b

:MaskEQ
rem call :MaskEQ VAR "%STR%"
setlocal EnableExtensions
set STR=%~2
if not defined STR goto _exit_MaskEQ
rem mask ! char to 0x1d before EnableDelayedExpansion
set STR=%STR:!=1d%
set i=0
setlocal EnableDelayedExpansion
:_next_MaskEQ
set C=!STR:~%i%,1!
if not defined C goto _ret_MaskEQ
set C=%C:"=%
set /a j=%i%+1
rem replace = char to pattern 0x1e
if "%C%"=="=" set STR=!STR:~0,%i%!1e!STR:~%j%!
set /a i=%i%+1
goto _next_MaskEQ
:_ret_MaskEQ
endlocal&set STR=%STR%
rem restore ! char from 0x1d
set STR=%STR:1d=!%
:_exit_MaskEQ
endlocal&set %1=%STR%
goto :EOF


:RestEQ
rem call :RestEQ VAR "%STR%"
setlocal EnableExtensions
set STR=%~2
if defined STR set STR=%STR:1e==%&rem restore = char from 0x1e
endlocal&set %1=%STR%
goto :EOF

14

Re: CMD/BAT: Замена одной строки на другую в txt файле

я немного не понял, а где тут путь к файлу ищется?
у меня ведь не на диске с:, а в локальной сети.