使用批处理文件编辑文件中的文本



我正在尝试使用批处理文件编辑文本文件中的一些文本行。线路如下-

#TEST_RSA_KEY=1
#V3SERVER0=109.73.122.107;29006
#DOWNLOAD0=109.73.122.112;29006

我需要把这些改成

#TEST_RSA_KEY=0
#V3SERVER0=91.207.36.31;29006
#DOWNLOAD0=91.207.36.37;29006

你建议我如何通过批处理文件做到这一点,我对此非常陌生,并且有非常基本的知识,所以请简单明了地回答!:)谢谢

未测试

@echo off
set file_loc=C:text.file.txt
for "usebackq tokens=* delims=" %%a in ("%file_loc%") do (
set "%%a"
)
set "#TEST_RSA_KEY=0"
set "#V3SERVER0=91.207.36.31;29006"
set "#DOWNLOAD0=91.207.36.37;29006"
set #>"%file_loc%"

我假设所有属性都以#开头

注意-我还没有测试过下面的任何代码示例,所以可能存在错误。但我在过去已经成功地使用了下面的所有技术,任何修复(如果必要的话)都应该是微不足道的

我下面的所有解决方案都假设空格永远不会出现在任何名称-值对中。如有必要,每种解决方案都可以进行调整,以支持空间。

如果行的顺序不重要,那么下面的纯批处理解决方案运行良好,速度相当快。在将新值附加到末尾之前,我使用FINDSTR删除要更改的行:

@echo off
>"file.txt.new" (
findstr /v /b "#TEST_RSA_KEY= #V3SERVER0= #DOWNLOAD0=" "file.txt" 
echo #TEST_RSA_KEY=0
echo #V3SERVER0=91.207.36.31;29006
echo #DOWNLOAD0=91.207.36.37;29006
)
move /y "file.txt.new" "file.txt" >nul

如果行的顺序很重要,那么我会使用我的JREPL.BAT实用程序——一个混合JScript/批处理正则表达式文本处理器。它是纯脚本,在XP以后的任何Windows机器上都可以本地运行。我建议将脚本放在路径中列出的目录中。我喜欢将"c:\utils"用于我所有的非标准实用程序。

一次一个简单的替换策略是最简单有效的解决方案,除非文件非常大,否则它应该非常快:

@echo off
call jrepl "^(#TEST_RSA_KEY)=.*" "$1=0"                  /f "file.txt" /o -
call jrepl "^(#V3SERVER0)=.*"    "$1=91.207.36.31;29006" /f "file.txt" /o -
call jrepl "^(#DOWNLOAD0)=.*"    "$1=91.207.36.37;29006" /f "file.txt" /o -

只要字符串中没有包含*?,并且没有以=:开头的值,就可以通过多一点代码来轻松维护(添加额外的替换)上述策略

@echo off
for %%A in (
"#TEST_RSA_KEY=0"
"#V3SERVER0=91.207.36.31;29006"
"#DOWNLOAD0=91.207.36.37;29006"
) do for /f "tokens=1* delims==" %%B in (%%A) do (
call jrepl "^(%%B)=.*" "$1=%%C" /f "file.txt" /o -
)

如果替换字符串已经在单独的文件(replace.txt)中,则可以删除*?限制:

@echo off
for /f "tokens=1* delims==" %%A in (replace.txt) do (
call jrepl "^(%%A)=.*" "$1=%%B" /f "file.txt" /o - 
)

或者替换字符串可以嵌入到批处理脚本本身中

@echo off
for /f "tokens=1* delims==" %%A in ('findstr "^#" "%~f0"') do (
call jrepl "^(%%A)=.*" "$1=%%B" /f "file.txt" /o - 
)
exit /b
#TEST_RSA_KEY=0
#V3SERVER0=91.207.36.31;29006
#DOWNLOAD0=91.207.36.37;29006

如果您愿意进行捕获组记账并准备一个长命令行(最大长度为8191字节):,那么整个工作可以一次完成得更高效

@call jrepl "(#TEST_RSA_KEY)=.* (#V3SERVER0)=.* (#DOWNLOAD0)=.*" "$2=0 $4=91.207.36.31;29006 $6=91.207.36.37;29006" /b /t " " /f "file.txt" /o -

只要!从不出现在值中,就可以使用先前3种方法中的任何一种的变体来使这种有效的解决方案更容易维护。例如:

@echo off
setlocal enableDelayedExpansion
set "find="
set "repl="
set "n=0"
for /f "tokens=1* delims==" %%A in ('findstr "^#" "%~f0"') do (
set "find=!find! (%%A)=.*"
set /a n+=2
set "repl=!repl! $!n!=%%B"
)
call jrepl "!find:~1!" "!repl:~1!" /b /t " " /f "file.txt" /o - 
exit /b
#TEST_RSA_KEY=0
#V3SERVER0=91.207.36.31;29006
#DOWNLOAD0=91.207.36.37;29006

最新更新