在文件中查找一行并replace下一行

使用.bat脚本,我想find一行说# Site 1并用variablesreplace下一行中的文本。 我在StackOverflow上find了关于查找和replace一行的教程,但找不到一行并replace了下一行。 任何帮助?

Solutions Collecting From Web of "在文件中查找一行并replace下一行"

 @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

您需要在开始时自行设置这三个变量。请记住,更多的命令会设置空格而不是制表符

 @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以代替读取的行; 如果不是,则读取的行被回显。

然后skip1标志被清除

如果读到%%a的行与分配给afterme的字符串匹配,那么标志skip1被设置(对y – 但是这个值并不重要)

请注意,空行和那些开始; 将被忽略,而不是转载 – 这是for /f标准行为。

如果你想replce开始文件,然后只需添加

 move /y newfile.txt "%filename%" 

goto :eof行之前。

尽管我喜欢使用批处理,但通常我会避免使用纯本地批​​处理来编辑文本文件,因为强大的解决方案通常很复杂且很慢。

这可以通过使用JREPL.BAT (一个执行正则表达式替换的混合JScript /批处理实用程序)轻松高效地完成。 JREPL.BAT是纯粹的脚本,可以从XP以后的任何Windows机器上本机运行。

 @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选项会在每个行写出之前检查每行的值,如果与#Site # Site 1匹配,则将SKIP设置为关闭(false)。 下一行只有在SKIP为false时才会被替换。

搜索字符串匹配整行。

替换字符串是存储在变量中的值。

此问题与此类似,可能使用同等的解决方案。 下面的纯批处理文件解决方案应该是最快的一种。

 @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 

如果输入文件有空行,并且还有其他限制,则此方法将失败。 有关此方法的进一步说明,请参阅此文章 。