batch:替换文本文件中的一行

时间:2012-11-04 14:56:36

标签: batch-file replace line text-files


我正试图替换这一行:

#        forward-socks5   /               127.0.0.1:9050 .

这一个:

        forward-socks5   /               127.0.0.1:9050 .

这一行属于一个配置文件,必须通过从开头删除#符号来启用(UN评论),除了用另一个没有#符号替换该行之外,我想不出更好的方法。登记/> 任何其他想法或方法都非常有用。

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

提前致谢


编辑:
我已经设法做了一行添加和删除使用我发现的两个代码和平。 我唯一的问题是以下代码删除了输出文件中的每一个感叹号!

@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

我想知道是否有办法在一步中完成查找/删除/添加行(不是我的两步)...

1 个答案:

答案 0 :(得分:10)

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

您无需在SET / 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)
  )
)