Показать полную графическую версию : Как добавить текст в середину текстрового файла
Есть текстовый файл 1.txt:
__________________________
aaa
[paste]
ccc
__________________________
К примеру [paste] нужно заменить на bbb, при этом пустые строки должны остаться (FOR /F не помог)
El Sanchez
04-01-2010, 17:05
Будем думать, что под [paste] подразумевается только 1 строка, а не целый абзац
@echo off
set "SRC=C:\Temp\1.txt"
for /f "usebackq tokens=*" %%a in ("%SRC%") do (
if not "%%a"=="" (
if "%%a"=="[paste]" (echo bbb>>tmp) else (echo %%a>>tmp)) else (echo.>>tmp)
)
copy /y tmp %SRC% 1>nul&&del /f /q tmp>nul
El Sanchez, спасибо за внимание!!! Но вопрос остаётся открытым - я писал: -"при этом пустые строки должны остаться" это важно!!!
Из справки цикла FOR: По умолчанию /F передает первый отделенный пробелом элемент из каждой строки каждого файла. Пустые строки пропускаются.
El Sanchez
05-01-2010, 14:44
Хех, вчера у меня этот сценарий работал, сегодня нет.
Вариант №2
@echo off
setlocal ENABLEDELAYEDEXPANSION
set "SRC=C:\Temp\1.txt"
set "ReplaceText=bbb"
set count=1
for /f "usebackq tokens=1* delims=:" %%a in (`findstr /in . "%SRC%"`) do call :func "%%a" "%%b" "%ReplaceText%"
endlocal
copy /y tmp %SRC% 1>nul&&del /f /q tmp>nul
goto :eof
:func
if not "%~1"=="!count!" (
set /a count+=1&echo.>>tmp
if "%~2"=="[paste]" (echo %~3>>tmp) else (echo %~2>>tmp)) else (
if "%~2"=="[paste]" (echo %~3>>tmp) else (echo %~2>>tmp))
set /a count+=1
P.S. Переменная ReplaceText не должна содержать спец. символов
Devils0411
05-01-2010, 21:40
А что если сделать возможность, при запуске пакетника, он просил ввести что-то в переменную ReplaceText?
Например:
@echo off
setlocal ENABLEDELAYEDEXPANSION
set "SRC=C:\Temp\1.txt"
set /P ReplaceText=Enter the data in the variable :
set count=1
for /f "usebackq tokens=1* delims=:" %%a in (`findstr /in . "%SRC%"`) do call :func "%%a" "%%b" "%ReplaceText%"
endlocal
copy /y tmp %SRC% 1>nul&&del /f /q tmp>nul
goto :eof
:func
if not "%~1"=="!count!" (
set /a count+=1&echo.>>tmp
if "%~2"=="[paste]" (echo %~3>>tmp) else (echo %~2>>tmp)) else (
if "%~2"=="[paste]" (echo %~3>>tmp) else (echo %~2>>tmp))
set /a count+=1
Текст написанный красным будет отображаться при запуске пакетника с просьбой ввести данные в переменную. Соответственно в переменной ReplaceText будет находится та информация, которую вы ввели.
El Sanchez, спасибо за проделанную работу!
Остались не решённые вопросы:
1. если пустых строк несколько в подряд, этот скрипт отрабатывает не корректно
2. в строчке пробел или несколько (исключительно)
El Sanchez
07-01-2010, 13:31
1. если пустых строк несколько в подряд, этот скрипт отрабатывает не корректно »
Все верно, моя ошибка. Вариант №3:
@echo off
setlocal ENABLEDELAYEDEXPANSION
set "SRC=C:\Temp\1.txt"
set /p ReplaceText=Заменяемый текст :
set /p ReplaceableText=Замещаемый текст :
set count=1
for /f "usebackq tokens=1* delims=:" %%a in (`findstr /in . "%SRC%"`) do call :func "%%a" "%%b" "%ReplaceText%"
endlocal
copy /y tmp %SRC% 1>nul&&del /f /q tmp>nul
goto :eof
:func
set /a Diff=%~1-!count!
if %Diff% GTR 0 (
for /l %%a in (1,1,%Diff%) do (set /a count+=1&echo.>>tmp)
if /i "%~2"=="%ReplaceableText%" (echo %~3>>tmp) else (echo %~2>>tmp)
) else (
if /i "%~2"=="%ReplaceableText%" (echo %~3>>tmp) else (echo %~2>>tmp)
)
set /a count+=1
2. в строчке есть пробел или несколько »
Не знаю я как строку, состоящую из одного или нескольких пробелов записать в файл.
уважаемый El Sanchez, ещё раз спасибо за помощь начинающему
последний вариант bat-файла не обрабатывает следующий текст:
///////////////////////
1
<
>
.
//////////////////////
можно чтото сделать?
El Sanchez
08-01-2010, 19:11
не обрабатывает следующий текст »
Потому что средствами cmd довольно-таки сложно обрабатывать богатый спецсимволами текст, поэтому без спецсредств не обойтись. Предлагаю вариант 4 с применением утилиты sed.
@echo off
set "SRC=C:\Temp\1.txt"
set "SedReplaceableText="
set /p ReplaceText=Заменяемый текст :
set /p ReplaceableText=Замещаемый текст :
for /f "tokens=1* delims==" %%a in ('set ReplaceText^|sed -e s/\\/\\\\/g^;s/\[/\\\[/g^;s/\./\\\./g^;s/\*/\\\*/g^;s/\$/\\\$/g') do set "ReplaceText=%%b"
for /f "tokens=1* delims==" %%a in ('set ReplaceableText^|sed -e s/\\/\\\\/g^;s/\[/\\\[/g^;s/\./\\\./g^;s/\*/\\\*/g^;s/\$/\\\$/g') do set "ReplaceableText=%%b"
sed -e /"%ReplaceableText%"/s//"%ReplaceText%"/<"%SRC%">>tmp
copy /y tmp %SRC% 1>nul&&del /f /q tmp>nul
P.S. С sed-ом я не особо дружу, регулярное выражение сделал как смог. (
P.P.S. Символ "^" не отрабатывается. (
Devils0411
08-01-2010, 19:34
El Sanchez, помоему данное задание из разряда программирования на C++
CMD/BAT - [решено] Замена строк конфига (http://forum.oszone.net/thread-151148.html)
Похожий вопрос, но задача несколько иная. К примеру, как в шапке, 1.txt: ...
aaa=1
[paste]
bbb=1
ccc=1
... Задача: Нужен скрипт, изменяющий в секции [paste] значение ccc=1 на ccc=0, если параметра ccc не существует, добавить ccc=0 именно в эту секцию.
скрипт, изменяющий в секции [paste] значение ccc=1 на ccc=0, если параметра ccc не существует, добавить ccc=0 именно в эту секцию »
@echo off
CALL:INISET 1.ini paste ccc 0
EXIT
:INISET %file_path% %section% %parm% %val%
::-----------------------------------------
SETLOCAL DisableDelayedExpansion
set $sn= & set $vf=0& set "$ft=%TEMP%\%RANDOM%%RANDOM%.tmp"
(for /f "tokens=1,2* delims==:" %%a in ('findstr /n "$" "%~1"') do (
set "$b=%%b"& set "$c=%%c"
SETLOCAL EnableDelayedExpansion
if "!$b:~0,1!"=="[" set "$sn=!$b:~1,-1!"
set $lf=_& if /i "!$sn!"=="%~2" if /i "!$b!"=="%~3" set "$lf="
if defined $c set "$c==!$c!"
if defined $lf echo/!$b!!$c!
if "!$sn!"=="%~2" if "!$vf!"=="0" set $vf=1& echo %~3=%~4
for /f "tokens=1,2 delims=:" %%i in ("!$sn!:!$vf!") do (
ENDLOCAL& set "$sn=%%i"& set "$vf=%%j")))>"%$ft%"
copy /y "%$ft%" "%~1">nul&& del "%$ft%"
::----------------
ENDLOCAL& GoTo:EOF
Попробовал Ваш скрипт, что-то не так. Он просто удаляет параметр "ссс" и ничего более не делает. :(
Foreigner
18-04-2011, 23:08
gsar (http://gnuwin32.sourceforge.net/packages/gsar.htm) "-s[paste]" "-rbbb" -o 1.txt
Он просто удаляет параметр "ссс" и ничего более не делает »исправил, была ошибка в случае если файл начинался не с имени секции
amel27, всё работает, но в моём случае значение параметра содержит символы, в результате скрипт не срабатывает, то есть к примеру так: CALL:INISET 1.ini paste ccc ""a 1","b 2","c 3"" Убираю внутренние кавычки - работает, но хотелось, чтоб они обрабатывались, а также возможна ли обработка символа | ?
значение параметра содержит символы »придется передавать не по значению, а по ссылке на переменную, содержащую это значение:
@echo off
set "$val="a 1","b 2"|"c 3""
CALL:INISET 1.ini paste ccc $val
EXIT
:INISET file_path section parm ByRef val
::---------------------------------------
SETLOCAL DisableDelayedExpansion
set $sn= & set $vf=0& set "$ft=%TEMP%\%RANDOM%%RANDOM%.tmp"
(for /f "tokens=1,2* delims==:" %%a in ('findstr /n "$" "%~1"') do (
set "$b=%%b"& set "$c=%%c"
SETLOCAL EnableDelayedExpansion
if "!$b:~0,1!"=="[" set "$sn=!$b:~1,-1!"
set $lf=_& if /i "!$sn!"=="%~2" if /i "!$b!"=="%~3" set "$lf="
if defined $c set "$c==!$c!"
if defined $lf echo/!$b!!$c!
if defined %~4 (set $4=!%~4!) else set "$4=%~4"
if "!$sn!"=="%~2" if "!$vf!"=="0" set $vf=1& echo %~3=!$4!
for /f "tokens=1,2 delims=:" %%i in ("!$sn!:!$vf!") do (
ENDLOCAL& set "$sn=%%i"& set "$vf=%%j")))>"%$ft%"
copy /y "%$ft%" "%~1">nul&& del "%$ft%"
::----------------
ENDLOCAL& GoTo:EOF
amel27, Всё бы хорошо, но вот так работает: set "$val="a 1","b 2"|"c 3"" А вот так - нет: set "$val="a 1","b 2""|c 3""
А вот так - нет:
Код:
set "$val="a 1","b 2""|c 3"" »для такой строки можно использовать код (намеренно заменил "," на "|"):
set $val="a 1"^|"b 2""|c 3"
Из этого примера видно, что спецсиволы вне кавычек нужно экранировать символом "^". Если мы теперь возьмём всю команду SET в кавычки, то произойдёт инверсия: всё что было в кавычках окажется за ними и наоборот, это нужно учесть при экранировании спецсимволов:
set "$val="a 1"|"b 2""^|c 3""
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.