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

时间:2015-04-20 09:29:47

标签: batch-file

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

#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

您如何推荐我通过批处理文件执行此操作,我对此非常陌生并且拥有非常基本的知识,请您回答这些简单明了的答案! :)谢谢

2 个答案:

答案 0 :(得分:0)

未经测试

@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%"

我假设所有属性都以#

开头

答案 1 :(得分:0)

注意 - 我没有测试下面的任何代码示例,因此可能存在错误。但是我过去已成功使用了下面的所有技术,任何修复(如果需要)都应该是相当简单的。

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

如果线的顺序不重要,那么以下纯批处理解决方案效果很好并且非常快。在将新值附加到结尾之前,我使用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 utility - 混合JScript /批处理正则表达式文本处理器。它是纯脚本,可​​以在任何Windows机器上从XP开始本地运行。我建议将脚本放在路径中列出的目录中。我喜欢使用" 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 -

只要没有任何字符串包含*?,并且没有任何值以{{{}开头,就可以使用更多代码轻松维护(添加其他替换)上述策略。 1}}:

=

如果替换字符串已经在单独的文件中(replace.txt),则可以删除@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 - ) *限制:

?

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

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

如果您愿意进行捕获组记录并准备一个长命令行(最长8191字节长度),则可以一次性完成整个作业:

@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

只要@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种方法中的任何一种方法的变体来使这种有效的解决方案更容易维护。例如:

!