使用.bat脚本,我想找到一行# Site 1
,并用变量替换下一行中的文本。我在StackOverflow上找到了用于查找和替换行的教程,但没有找到一行并替换下一行。有什么帮助吗?
答案 0 :(得分: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
。
你需要自己设置三个变量。请记住,更多的命令设置空格而不是标签
答案 1 :(得分: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
以代替读取的行;如果没有,读取的行就会被回显。
然后清除skip1
标志
如果读取到%%a
的行与分配给afterme
的字符串相匹配,则会设置标记skip1
(到y
- 但是值是什么值无关紧要是)
请注意,空行和那些以;
开头的行将被忽略而不会被重现 - 这是for /f
的标准行为。
如果要重新启动起始文件,只需添加
即可move /y newfile.txt "%filename%"
在goto :eof
行之前。
答案 2 :(得分: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选项在写出之前检查每一行的值,如果匹配# Site 1
则设置SKIP关闭(false)。只有当SKIP为假时,才会替换下一行。
搜索字符串匹配整行。
替换字符串是存储在变量中的值。
答案 3 :(得分: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。