PDA

Показать полную графическую версию : [решено] Замена строчек в файл txt


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

sov44
04-12-2013, 23:05
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
set filename=old.txt set $filename=new.txt »

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

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

angel_lyucifer
05-12-2013, 23:52
Ясно, спасибо! -)

SharkyEXE
27-02-2015, 10:45
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
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
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=20395) запускаю файл 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
4) запустил файл 1.cmd »
4) Запустил файл 1.cmd 1
Ничего если я немного исправил 4 пункт?
Еще можно так:
4) Перетащил файл 1 на файл 1.cmd

SharkyEXE
27-02-2015, 16:00
Foreigner
Удалил то сообщение, Ваш код полностью рабочий
Пожалуйста, прочтите моё сообщение (http://forum.oszone.net/post-2476703-8.html)
Спасибо.

Foreigner
27-02-2015, 16:11
SharkyEXE, Не совсем понятно зачем такая мудреная схема. Возникает несколько вопросов:

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

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

SharkyEXE
27-02-2015, 16:24
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=20393) запускается Ваш код
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
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
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
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
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
@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
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
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
Foreigner
Для Вашего примера (http://forum.oszone.net/post-2476749-19.html) не работает пустые строки в файле.

Если Ваш пример (http://forum.oszone.net/post-2476749-19.html) запустить для файла с таким содержимым

[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
{пустая строка}




© OSzone.net 2001-2012