使用.bat脚本,我想find一行说# Site 1
并用variablesreplace下一行中的文本。 我在StackOverflow上find了关于查找和replace一行的教程,但找不到一行并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
如果输入文件有空行,并且还有其他限制,则此方法将失败。 有关此方法的进一步说明,请参阅此文章 。