batch-file - 批处理 : replace a line in a text file

标签 batch-file replace line text-files

我正在尝试替换这一行:

#        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 的值在一个变量中,然后打开延迟扩展,处理该行,然后将其关闭。

您不需要在 SET/A 计算中扩展变量。

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

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

将整个循环包含在括号内并仅重定向到输出文件一次会更有效。

@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)
  )
)

关于batch-file - 批处理 : replace a line in a text file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13219628/

相关文章:

batch-file - 为什么批处理文件中的 FOR/L 不能按预期工作?

batch-file - 用于重命名然后将文件从 1 个文件夹移动到另一个文件夹的批处理脚本

windows - 退出批处理时自动重启批处理文件

python - 替换文本中单词列表的下划线空格的最快方法

string - 在 VB 6.0 中替换 ' with ' 时发生堆栈溢出

r - 使用 scale_linetype_manual 更改 ggplot 图中的一行

batch-file - 批处理 - 动态标签或函数

greping stdin 和管道到 sed 似乎不起作用

algorithm - 扩展线段以适合边界框

linux - 保存 zsh 的目录特定历史记录