2015-04-20 123 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