Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何用行号替换任何行?_Windows_Batch File_Replace_Cmd - Fatal编程技术网

Windows 如何用行号替换任何行?

Windows 如何用行号替换任何行?,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

编辑:在@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 _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