Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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
Batch file 批处理:替换文本文件中的一行_Batch File_Replace_Line_Text Files - Fatal编程技术网

Batch file 批处理:替换文本文件中的一行

Batch file 批处理:替换文本文件中的一行,batch-file,replace,line,text-files,Batch File,Replace,Line,Text Files,我正在尝试替换这一行: # forward-socks5 / 127.0.0.1:9050 . 关于这一点: forward-socks5 / 127.0.0.1:9050 . 这一行属于一个配置文件,必须通过从开头删除#符号来启用(未注释),我想不出比用另一个没有#符号的行替换该行更好的方法。 任何其他想法或方法都会非常有用 顺便说一句,文本前的空格也在那里。我已经粘贴了原始文件中的文本 提前谢谢


我正在尝试替换这一行:

#        forward-socks5   /               127.0.0.1:9050 .
关于这一点:

        forward-socks5   /               127.0.0.1:9050 .
这一行属于一个配置文件,必须通过从开头删除#符号来启用(未注释),我想不出比用另一个没有#符号的行替换该行更好的方法。
任何其他想法或方法都会非常有用

顺便说一句,文本前的空格也在那里。
我已经粘贴了原始文件中的文本

提前谢谢


编辑:
我已经设法使用我找到的两段代码来添加和删除行。 我唯一的问题是,下面的代码删除了输出文件中的所有感叹号

@echo off

:Variables
SETLOCAL ENABLEDELAYEDEXPANSION
set InputFile=config.txt
set OutputFile=config-new.txt
set _strFind=#        forward-socks5   /               127.0.0.1:9050 .
set _strInsert=        forward-socks5   /               127.0.0.1:9050 .
set i=0

:Replace
for /f "usebackq tokens=1 delims=[]" %%A in (`find /n "%_strFind%" "%InputFile%"`) do (set _strNum=%%A)
for /f "usebackq delims=" %%A in ("%InputFile%") do (
  set /a i = !i! + 1
  echo %%A>>"%OutputFile%"
  if [!i!] == [%_strNum%] (echo %_strInsert%>>"%OutputFile%")
)
type %OutputFile% | findstr /i /v /c:"%_strFind%">config-new2.txt

我想知道是否有任何方法可以一步完成查找/删除/添加行(而不是我的两步).

包含
的行已损坏,因为在FOR变量(
%%A
)扩展后发生延迟扩展。这可以通过禁用延迟扩展来解决。在循环中,您将
%%A的值保存在变量中,然后打开延迟扩展,处理行,然后关闭延迟扩展

不需要在集合/a计算中展开变量

通过在循环中添加IF语句,可以一步完成所有操作

事实上,您甚至不需要SET/A或FINDSTR。IF语句可以测试该行是否与搜索字符串匹配。你不需要为你的问题延迟扩展

将整个循环包含在parens中并重定向到输出文件一次更有效

@echo off
setlocal disableDelayedExpansion

:Variables
set InputFile=config.txt
set OutputFile=config-new.txt
set "_strFind=#        forward-socks5   /               127.0.0.1:9050 ."
set "_strInsert=        forward-socks5   /               127.0.0.1:9050 ."

:Replace
>"%OutputFile%" (
  for /f "usebackq delims=" %%A in ("%InputFile%") do (
    if "%%A" equ "%_strFind%" (echo %_strInsert%) else (echo %%A)
  )
)

只需检查:您想使用Windows批处理文件执行此操作吗?(和:手动编辑文件不是一个选项是否正确?)是的,我愿意通过批处理文件执行此操作此配置应通过自动脚本在多个系统上设置此配置将非常有用,我需要一个小的修改。假设不搜索#forward-socks 5/127.0.0.1:9050。我要搜索包含#forward-socks5/127.0.0.1:9050。例如#forward-socks5/127.0.0.1:9050.abc,#forward-socks5/127.0.0.1:9050.test。等等。在这种情况下如何使用正则表达式?@BaneeIshaqueK-看看我的。这是我用来批量操作文本文件的所有工具。我厌倦了批量脚本。最后,我使用VisualStudio开发了c#可执行文件,用于各种用途,而不是批处理脚本。无论如何,我将尝试使用JREPL.BAT regex实用程序。此解决方案在输出文件中添加了几行“ECHO is off”。@JohnTube如果文件中只包含空格和/或制表符,则可能出现“ECHO is off”行。使用“echo”(“echo”)而不是“echo”可以防止这些错误。我知道这看起来是错误的,但实际上它工作可靠。大多数人使用“echo”,但点形式可能会在一些不清楚的情况下失败。括号形式从来不会失败。