2015-02-17 2 views
1

Используя сценарий .bat, я хочу найти строку, которая говорит # Site 1, и заменить текст в следующей строке переменной. Я нашел руководства по StackOverflow для поиска и замены строки, но не нашел строку и заменил следующую строку. Любая помощь?Найдите строку в файле и замените следующую строку

ответ

3
@echo off 

set "the_file=C:\someFile" 
set "search_for=somestring" 
set "variable=http://site1" 

for /f "tokens=1 delims=:" %%# in ('findstr /n /c:"%search_for%" "%the_file%"') do (
    set "line=%%#" 
    goto :break 
) 
:break 


set /a lineBefore=line-1 
set /a nextLine=line+1 


break>"%temp%\empty"&&fc "%temp%\empty" "%the_file%" /lb %lineBefore% /t |more +4 | findstr /B /E /V "*****" >newFile 
echo %variable%>>newFile 
more "%the_file%" +%nextLine% 1>>newFile 

echo move /y newFile "%the_file%" 

Проверьте newFile нормально и удалить echo в передней части последней строки.

вам необходимо установить три переменные в начале по yourself.Have на виду, что более команда устанавливает пробелы вместо вкладок

+0

Так что же означает каждая переменная? –

+0

@AidanEdwards - переменная, которую вы хотите установить на следующей строке (после search_for) – npocmaka

+0

Кажется, что не работает с этим: set/p ip = "Вставить сервер ip:" Установите "the_file = pc2v9. ini " set" search_for = # Site 1 " set" variable = server = "% ip%": 50002 " –

0
@ECHO OFF 
SETLOCAL 
SET "filename=q28567045.txt" 
SET "afterme=# Site 1" 
SET "putme=put this line after # Site 1" 
SET "skip1=" 
(
FOR /f "usebackqdelims=" %%a IN ("%filename%") DO (
IF DEFINED skip1 (ECHO(%putme%) ELSE (ECHO(%%a) 
SET "skip1=" 
IF /i "%%a"=="%afterme%" SET skip1=y 
) 
)>newfile.txt 

GOTO :EOF 

Производит newfile.txt

флаг `skip1, чтобы пропустить строка сначала сбрасывается, затем файл читается по строкам.

Если установлен флажок skip1, тогда вместо строки будет отображаться строка замены echo ed; если нет, чтение строки повторяется.

Затем skip1 флаг сброшен

Если линия читать %%a соответствует строка присваивается afterme то флаг skip1 установлен (для y - но это не имеет значения, что значение)

Обратите внимание, что пустые строки и те, которые начинаются ;, будут проигнорированы и не воспроизведены - это стандартное поведение for /f.

Если вы хотите Заменяйте стартовый файл, а затем просто добавить

move /y newfile.txt "%filename%" 

до goto :eof линии.

0

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

Это можно сделать легко и эффективно с помощью JREPL.BAT - гибридной утилиты JScript/пакетной обработки, которая выполняет регулярную замену выражения. JREPL.BAT - это чистый скрипт, который запускается изначально на любом компьютере Windows с XP.

@echo off 
setlocal 
set "newVal=Replacement value" 
call jrepl "^.*" "%newValue%" /jbeg "skip=true" /jendln "skip=($txt!='# Site 1')" /f test.txt /o - 

Параметр/F параметр определяет файл для обработки

Опция/O со значением - указывает заменить исходный файл с результатом.

Параметр/JBEG инициализирует команду пропускать (не заменять) каждую строку.

Параметр/JENDLN проверяет значение каждой строки непосредственно перед ее записью и устанавливает значение SKIP off (false), если оно соответствует # Site 1. Следующая строка будет заменена только тогда, когда SKIP будет ложным.

Строка поиска соответствует целой строке.

Строка замены - это ваше значение, хранящееся в переменной.

0

Эта проблема аналогична this one и может использовать эквивалентное решение. Решение чистого пакетного файла ниже должно быть самым быстрым в своем роде.

@echo off 
setlocal EnableDelayedExpansion 

set "search=# Site 1" 
set "nextLine=Text that replaces next line" 


rem Get the line number of the search line 
for /F "delims=:" %%a in ('findstr /N /C:"%search%" input.txt') do set /A "numLines=%%a-1" 

rem Open a code block to read-input-file/create-output-file 

< input.txt (

    rem Read the first line 
    set /P "line=" 

    rem Copy numLines-1 lines 
    for /L %%i in (1,1,%numLines%) do set /P "line=!line!" & echo/ 

    rem Replace the next line 
    echo %nextLine% 

    rem Copy the rest of lines 
    findstr "^" 

) > output.txt 

rem Replace input file with created output file 
move /Y output.txt input.txt > NUL 

Этот метод не будет работать, если входной файл имеет пустые строки и также имеет другие ограничения. Дополнительное описание этого метода см. В this post.

Смежные вопросы