Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Замена строчек в файл txt (http://forum.oszone.net/showthread.php?t=273428)

angel_lyucifer 04-12-2013 22:08 2267144

Замена строчек в файл txt
 
Привет всем!
У меня есть только один файл 1.txt он содержит много строчек английских и русских, среди них есть одна строка #sound_on_vlp только её нужно заменить на #sound_off_vlp при запуске батника. А другие строки оставались неизменными и в таком же порядке...
Я нашёл на вашем форуме похожую тему, но в той теме приведённый пример не подходит.
http://forum.oszone.net/thread-198866.html
Пожалуйста помогите, создать такой батник?

sov44 04-12-2013 23:05 2267188

angel_lyucifer, пробуйте
Код:

@echo off
setlocal EnableDelayedExpansion

set filename=old.txt
set $filename=new.txt

set in=#sound_on_vlp
set out=#sound_off_vlp

for /f "tokens=1* delims=]" %%A in ('find /v /n "" ^<"%filename%"') do (
        set line=%%B
        if "!line!"=="%in%" (echo %out%>>%$filename%) else (echo.!line!>>%$filename%)
                )
del /q %filename%
ren "%$filename%" "%filename%"
       
exit /b


angel_lyucifer 05-12-2013 19:50 2267589

Цитата:

Цитата sov44
set filename=old.txt set $filename=new.txt »

У меня есть только один файл txt.

sov44 05-12-2013 20:08 2267602

angel_lyucifer, %$filename% - временный файл с нужным результатом. Генерируется скриптом и затем подменяет оригинальный %filename%

angel_lyucifer 05-12-2013 23:52 2267740

Ясно, спасибо! -)

SharkyEXE 27-02-2015 10:45 2476539

2 all
Всем здравствуйте.

Пожалуйста, помогите мне.
1) есть файл 1
2) пример файла 1
Скрытый текст
Код:

DialogType=1
DockAutoload=1
AltLineFill=28
SaveRelative=1
SaveOnExitEnable=1
SaveSessions=1
WindowRect=52010000270100005C0200008A010000
ModalDialogEnable=0
AltLineFill=398
SaveData=2039


Что хочется:
1) запускается файл *.bat или *.cmd
2) после запуска файла *.bat или *.cmd, в файле 1 надо заменить все строки, которые содержат AltLineFill= (после = может быть написано что угодно) на AltLineFill=0
3) после замены, кодировка файла 1 должна остаться такой же, как было до замены

То есть, если кодировка файла 1 до замены: 866 (OEM - русская), то после замены кодировка файла 1 должна остаться: 866 (OEM - русская)

Хочется получить универсальное решение: любое текстовое расширение файла (ini, txt, cfg, inf или другое) + любая кодировка файла (1251, 866, 1250 или другая)

Если универсальности не получиться, напишите мне, пожалуйста, я напишу Вам определенную кодировку файла и определенное текстовое расширение файла.

На примере файла 1
Было
Скрытый текст
Код:

DialogType=1
DockAutoload=1
AltLineFill=28
SaveRelative=1
SaveOnExitEnable=1
SaveSessions=1
WindowRect=52010000270100005C0200008A010000
ModalDialogEnable=0
AltLineFill=398
SaveData=2039

Стало
Скрытый текст
Код:

DialogType=1
DockAutoload=1
AltLineFill=0
SaveRelative=1
SaveOnExitEnable=1
SaveSessions=1
WindowRect=52010000270100005C0200008A010000
ModalDialogEnable=0
AltLineFill=0
SaveData=2039


Спасибо.

Foreigner 27-02-2015 11:42 2476571

SharkyEXE, Примерно так, без учета кодировки:
Код:

@echo off
setlocal

if "%~1"=="" (

    echo ERROR: No file to edit, run '%~nx0 file.ext' & exit /b
   
)

for /f "tokens=*" %%i in ('type %1') do call:1 "%%i"
move tmp.txt %1
goto:eof

:1

1>nul 2>&1 set "%~1"
1>>tmp.txt (

    if defined AltLineFill (echo AltLineFill=0) else (echo %~1)
   
)

set "AltLineFill="


SharkyEXE 27-02-2015 15:56 2476703

Foreigner
Пожалуйста, если у Вас есть время, возможность, желание - сделайте Ваш код, чтобы он работал так:
1) создается пустой файл C:\1.cmd
2) в пустой файл C:\1.cmd вставляется Ваш код
3) внутри файла C:\1.cmd указываю путь для изменяемого файла C:\Program Files\AkelPadmax_port\1.txt
4) содержимое файла C:\Program Files\AkelPadmax_port\1.txt до
Скрытый текст
Код:

DialogType=1
DockAutoload=1
AltLineFill=28
SaveRelative=1
SaveOnExitEnable=1
SaveSessions=1
WindowRect=52010000270100005C0200008A010000
ModalDialogEnable=0
AltLineFill=398
SaveData=2039

5) запускаю файл C:\1.cmd
5) содержимое файла C:\Program Files\AkelPadmax_port\1.txt после
Скрытый текст
Код:

DialogType=1
DockAutoload=1
AltLineFill=0
SaveRelative=1
SaveOnExitEnable=1
SaveSessions=1
WindowRect=52010000270100005C0200008A010000
ModalDialogEnable=0
AltLineFill=0
SaveData=2039


Foreigner 27-02-2015 15:56 2476704

Цитата:

Цитата SharkyEXE
4) запустил файл 1.cmd »

4) Запустил файл 1.cmd 1
Ничего если я немного исправил 4 пункт?
Еще можно так:
4) Перетащил файл 1 на файл 1.cmd

SharkyEXE 27-02-2015 16:00 2476705

Foreigner
Удалил то сообщение, Ваш код полностью рабочий
Пожалуйста, прочтите моё сообщение
Спасибо.

Foreigner 27-02-2015 16:11 2476711

SharkyEXE, Не совсем понятно зачем такая мудреная схема. Возникает несколько вопросов:

1. Где должны быть 1.cmd и 1.txt
2. Зачем копировать батник если его можно запустить и получить результат
3. Откуда берется 1.txt
4. Откуда запускается батник, который должен все это сделать

Обрисуйте вашу задачу в целом.

SharkyEXE 27-02-2015 16:24 2476715

Foreigner

1.cmd - в этом файле один раз прописывается код
Я не имею желания каждый раз прописывать Ваши строки в командной строке для изменения файла

1.txt - это изменяемый файл
Путь к файлу 1.txt указывается внутри файла 1.cmd

Я запускаю файл 1.cmd и получаю измененный файл 1.txt

Итого, если проще, должно быть так:

1) в Вашем коде указывается путь полный путь C:\Program Files\AkelPadmax_port\1.txt
Путь C:\Program Files\AkelPadmax_port\1.txt - это файл, в котором будем делать замену строк
2) содержимое файла C:\Program Files\AkelPadmax_port\1.txt до
Скрытый текст
Код:

DialogType=1
DockAutoload=1
AltLineFill=28
SaveRelative=1
SaveOnExitEnable=1
SaveSessions=1
WindowRect=52010000270100005C0200008A010000
ModalDialogEnable=0
AltLineFill=398
SaveData=2039

3) запускается Ваш код
4) содержимое файла C:\Program Files\AkelPadmax_port\1.txt после
Скрытый текст
Код:

DialogType=1
DockAutoload=1
AltLineFill=0
SaveRelative=1
SaveOnExitEnable=1
SaveSessions=1
WindowRect=52010000270100005C0200008A010000
ModalDialogEnable=0
AltLineFill=0
SaveData=2039


Foreigner 27-02-2015 16:30 2476719

Цитата:

Цитата SharkyEXE
1.cmd - в этом файле один раз прописывается код
Я не имею желания каждый раз прописывать Ваши строки в командной строке для изменения файла »

Ну так пропишите в 1.cmd путь к 1.txt :) Он же, путь, постоянный?
Код:

@echo off
setlocal

for /f %%i in ('type "C:\Path\To\1.txt"') do call:1 "%%i"
move tmp.txt "C:\Path\To\1.txt"
goto:eof

:1
...


SharkyEXE 27-02-2015 16:35 2476722

Foreigner
А нельзя, пожалуйста, без call сделать, типа такого:
Скрытый текст
Код:

@echo off
setlocal

for /f %%i in ('type "C:\Path\To\1.txt"') do (

1>nul 2>&1 set "%~1"
1>>"C:\Path\To\tmp.txt" (

    if defined AltLineFill (echo AltLineFill=0) else (echo %~1)
   
)

set "AltLineFill="
)

move "C:\Path\To\tmp.txt" "C:\Path\To\1.txt"


Foreigner 27-02-2015 16:42 2476725

SharkyEXE, Можно:
Код:

@echo off
setlocal

for /f "tokens=*" %%i in ('type "C:\Users\---\Desktop\1.txt"') do (

    1>nul set "%%~i"
    1>>tmp.txt (

        if defined AltLineFill (echo AltLineFill=0) else (echo %%i)
        set "AltLineFill="
   
))

move tmp.txt "C:\Users\---\Desktop\1.txt"


SharkyEXE 27-02-2015 16:50 2476729

Foreigner
А можно, пожалуйста, сделать так, чтобы AltLineFill было с пробелом, вот так Alt Line Fill + добавить переменные
Типа такого, код не работает:
Скрытый текст
Код:

@echo off

Set PathReplaceFile C:\Users\---\Desktop\1.txt
Set PathTmpFile C:\Users\---\Desktop\tmp.txt
Rem Заменяемая строка, после = любое содержимое
Set Input Alt Line Fill =
Rem На что меняем
Set Output Alt Line Fill=0

setlocal

for /f "tokens=*" %%i in ('type "%PathReplaceFile%"') do (

    1>nul set "%%~i"
    1>>"%PathTmpFile%" (

        if defined "%Input%" (echo "%Output%") else (echo %%i)
        {что тут писать не знаю}
   
))

move "%PathTmpFile%" "%PathReplaceFile%"


Foreigner 27-02-2015 17:12 2476740

Код:

@echo off
setlocal

for /f "tokens=*" %%i in ('type "C:\Path\To\1.txt"') do (

    1>nul 2>&1 set "%%~i"
    1>>tmp.txt (

        1>nul 2>&1 set Alt Line Fill && (echo Alt Line Fill=0) || (echo %%i)
        set "Alt Line Fill="
   
))

move tmp.txt "C:\Path\To\1.txt"


SharkyEXE 27-02-2015 17:22 2476744

Foreigner
А можно, пожалуйста, добавить переменные
Типа такого, код не работает:
Скрытый текст
Код:

@echo off

Set PathReplaceFile = "C:\Users\---\Desktop\1.txt"
Set PathTmpFile = "C:\Users\---\Desktop\tmp.txt"
Rem Заменяемая строка
Set Input = "Alt Line Fill"
Rem На что меняем
Set Output = "Alt Line Fill=0"

setlocal

for /f "tokens=*" %%i in ('type "%PathReplaceFile%"') do (

    1>nul 2>&1 set "%%~i"
    1>>"%PathTmpFile%" (

        1>nul 2>&1 set "%Input%" && (echo "%Output%") || (echo %%i)
        set "%Input%="
   
))

move "%PathTmpFile%" "%PathReplaceFile%"


Foreigner 27-02-2015 17:38 2476749

SharkyEXE, Ставьте задачу полностью с самого начала, от этого зависит ответ:
Код:

@echo off
setlocal

set "in=C:\Path\To\1.txt"
set "tochange=Alt Line Fill"
set "value=0"

for /f "tokens=1,2 delims==" %%i in ('type "%in%"') do (

    1>>tmp.txt (if /i "%%i"=="%tochange%" (echo %%i=%value%) else (echo %%i=%%j))

)

move tmp.txt "%in%"


SharkyEXE 01-03-2015 13:42 2477410

Foreigner
Для Вашего примера не работает пустые строки в файле.

Если Ваш пример запустить для файла с таким содержимым
Скрытый текст
Код:

[1213]
{пустая строка}
DialogType=1
DockAutoload=1
Alt Line Fill=28
SaveRelative=1
SaveOnExitEnable=1
SaveSessions=1
WindowRect=52010000270100005C0200008A010000
ModalDialogEnable=0
Alt Line Fill=398
SaveData=2039

[6498]
{пустая строка}
DialogType=1
DockAutoload=1
Alt Line Fill=28
SaveRelative=1
SaveOnExitEnable=1
SaveSessions=1
WindowRect=52010000270100005C0200008A010000
ModalDialogEnable=0
Alt Line Fill=398
SaveData=2039
{пустая строка}
{пустая строка}

то на выходе получаем такую бяку
Скрытый текст
Код:

[1213]=
DialogType=1
DockAutoload=1
Alt Line Fill=0
SaveRelative=1
SaveOnExitEnable=1
SaveSessions=1
WindowRect=52010000270100005C0200008A010000
ModalDialogEnable=0
Alt Line Fill=0
SaveData=2039
[6498]=
DialogType=1
DockAutoload=1
Alt Line Fill=0
SaveRelative=1
SaveOnExitEnable=1
SaveSessions=1
WindowRect=52010000270100005C0200008A010000
ModalDialogEnable=0
Alt Line Fill=0
SaveData=2039
{пустая строка}



Время: 20:31.

Время: 20:31.
© OSzone.net 2001-