2015-04-20 121 views
0

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

#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 

你会如何建议我通过一个批处理文件做到这一点,我很新的这一点,并有非常基本知识请简单明了的答案! :)谢谢

+0

总是想用相同的内容修改该文件吗? –

+0

欢迎来到SO,请阅读http://stackoverflow.com/help/how-to-ask –

回答

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

我认为所有的属性与#

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 /批正则表达式文本处理器这是纯粹的脚本,可以在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 - 
) 

*一个如果替换字符串已经在单独的文件中(替换),可以删除限制。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种方法的变型可被用于制备本高效的解决方案更容易maintai n,只要!从不出现在值中。例如:

@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