Windows 如何用行号替换任何行?
编辑:在@aschipfl的大力帮助下,代码的功能达到了我想要的%110!我做了一些额外的研究,使它易于使用,并提示额外的%10:PWindows 如何用行号替换任何行?,windows,batch-file,replace,cmd,Windows,Batch File,Replace,Cmd,编辑:在@aschipfl的大力帮助下,代码的功能达到了我想要的%110!我做了一些额外的研究,使它易于使用,并提示额外的%10:P @echo off setlocal EnableExtensions DisableDelayedExpansion rem // Create a prompt to set the variables set /p _FILETYPE="What file type: " set /p _LINENUM="Which line: " set /p _NEW
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Create a prompt to set the variables
set /p _FILETYPE="What file type: "
set /p _LINENUM="Which line: "
set /p _NEWLINE="Make line say: "
rem // Start the loop, and set the files
for %%f in (*%_FILETYPE%) do (
set "_FILE=%%f"
echo "_FILE=%%f"
rem // To execute seperate code before the end of the loop, starting at ":subroutine".
call :subroutine "%%f"
)
:subroutine
rem // Write to a temporary file:
> "%_FILE%.new" (
rem /* Loop through each line of the original file,
rem preceded by the line number and a colon `:`:*/
for /F "delims=" %%A in ('findstr /N "^" "%_FILE%"') do (
rem // Store the current line with prefix to a variable:
set "LN=%%A"
rem /* Store the line number into another variable;
rem everything up to the first non-numeric char. is regarded,
rem which is the aforementioned colon `:` in this situation: */
set /A "NUM=LN"
rem // Toggle delayed expansion to avoid trouble with `!`:
setlocal EnableDelayedExpansion
rem /* Compare current line number with predefined one and replace text
rem in case of equality, or return original text otherwise: */
if !NUM! equ %_LINENUM% (
echo(!_NEWLINE!
) else (
rem // Remove line number prefix:
echo(!LN:*:=!
)
endlocal
)
)
rem // Move the edited file onto the original one:
move /Y "%_FILE%.new" "%_FILE%"
endlocal
exit /B
原始问题:
这句话中的任何一句都无关紧要。我只想能够从.txt中选择任何一行,并用我选择的任何内容替换它
举个例子:也许我有一堆.txt,我想用“香草”来替换它们中的第5行。然后选择将所有.txt的第10行替换为“绿色”。等等
我见过很多人问同样的主要问题。但我一直在寻找情景答案。
“如何替换特定的行?”“您搜索行中已有的内容,并将其替换为您的新文本”-我不能这样做。我需要它是动态的,因为每个“第5行”中的内容是不同的,或者有很多其他行具有相同的文本
我尝试了我能找到的唯一答案,但它所做的只是将所有行替换为“!ln::=!”,而不是重复
@echo off
setlocal disableDelayedExpansion
set "file=yourFile.txt"
set "newLine5=NewLine5Here"
>"%file%.new" (
for /f "delims=" %%A in ('findstr /n "^" "%file%"') do for /f "delims=:" %%N in ("%%A") do (
set "ln=%%A"
setlocal enabableDelayedExpansion
if "!ln:~0,6!" equ "5:FMOD" (echo(!newLine5!) else echo(!ln:*:=!
endlocal
)
)
move /y "%file%.new" "%file%" >nul
…将所有行替换为“!ln::=!”,而不是回显
但这是正确的,因为FINDSTR/N
在每行前面加上行号作为前缀。!ln::=代码>仅再次删除行号。
而findstr
技巧用于避免跳过空行或以开头的行代码>(下线字符)
!行:*=代码>将第一个双冒号(包括它)之前的所有内容都替换为零。
这比对“delims=:”
使用要好,因为delims=:
还会在一行的前面去掉两个冒号
延迟扩展的切换是必要的,以避免意外剥离代码>和^
行中的设置“ln=%%A”
要修复代码:
setlocal DisableDelayedExpansion
for /f "delims=" %%A in ('findstr /n "^" "%file%"') do (
set "ln=%%A"
setlocal EnableDelayedExpansion
if "!ln:~0,6!" equ "5:FMOD" (
set "out=!newLine5!"
) else (
set "out=!ln:*:=!"
)
echo(!out!
endlocal
)
以下(注释)代码应适用于您:
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_FILE=yourFile.txt”
设置“_NEWLINE=NewLine5Here”
设置/A“\u LINENUM=5”&rem/(目标行号)
rem//写入临时文件:
>“%\u文件%.new”(
rem/*循环遍历原始文件的每一行,
rem前面有行号和冒号“:”:*/
对于/F“delims=“%%A in('findstr/N“^”“%\u FILE%”)do(
rem//将带有前缀的当前行存储到变量:
设置“LN=%%A”
rem/*将行号存储到另一个变量中;
rem第一个非数字字符之前的所有内容都被视为,
rem是前面提到的冒号“:`在这种情况下:*/
设置/A“NUM=LN”
rem//切换延迟扩展以避免出现“!”问题:
setlocal EnableDelayedExpansion
rem/*将当前行号与预定义行号进行比较并替换文本
如果相等,则返回rem,否则返回原始文本:*/
if!NUM!eq%\u LINENUM%(
回声(!\u新线!
)否则(
rem//删除行号前缀:
回声(!LN::=!
)
端部
)
)
rem//将编辑过的文件移到原始文件上:
移动/Y“%\u文件%。新建“%\u文件%”
端部
退出/B
除了代码中的EnableDelayedExpansion
中的键入之外,您甚至不需要第二个for/F
循环来获取行号,也不需要从带前缀的行文本中提取一定数量的字符
请注意,这种方法在行号大于231-1=2147483647时失败。没有任何行被它完全替换为空。它被字面上替换为“!ln::=!”。他们都说“!ln::=!”。但我明白你的意思。不管怎样,我猜那块代码不是我需要处理的。但我确实需要一些东西。@LethalDumpster这是因为你必须在输入FOR之前禁用DelayedExpansion,而你在“setlocal enabableDelayedExpansion”中有一个拼写错误。我添加了一个修复程序,得到“FINDSTR:无法打开”。可能我用错了。批处理文件在一个文件夹中,只有一个“test.txt”。为我的无知道歉。我实际上还不是新手。我只是需要一个工作工具。@LethalDumpster您是不是set file=test.txt
?还是直接将其修改为findstr/n“^”test.txt
实际上两者都有。虽然没有删除百分比。完成了,但我不再收到错误。但我没有看到第5行发生变化。这是CMD中显示的内容(设置“ln=5:Replace Me”setlocal EnableDelayedExpansion if“!ln:~0,6!”eq“5:FMOD”(设置“out=!newLine5!”)else(设置“out=!ln::=!”)echo(!out!endlocal)替换我
如果我做对了,条件如果“!ln:~0,6!”eq“5:FMOD”
应该替换为如果%%N eq 5
,并且EnableDelayedExpansion
中有一个打字错误,就是这样…哦,我的天哪,非常感谢!终于有答案了!你认为有什么方法可以提高这个级别,并运行文件夹中的每个文件吗?这当然是除了批处理本身之外的:不客气!是的,你可以我们将围绕一个,这样%\u FILE%`将被循环元变量替换;问题是所有文件要替换的行号和替换文本是否相同;无论如何,我建议您给ITV一个尝试,如果出现问题,只需问一个新问题……没错,替换文本需要相同。我尝试了gett将其设置为循环,并且在仅设置变量时,它确实可以完美地运行。但是,当尝试在“移动文件”之后包含其余代码时,它失败并中止。Gut说这是一个缩进问题。但我不知道。也就是说:for%%f in(*.txt)do(设置“_file=%%f”
Scratch,我通过将代码的其余部分作为子例程执行来修复它:P