2015-06-03 126 views
-4

我有文件,它有一些行..查找字符串並批量替換下一個字

line no 20 # Every Vagrant virtual environment requires a box to build off 

line no 21   config.vm.box = "test_15_4" 

line no 22 # The URL from where the 'config.vm.box' box will be fetched if it 

line no 23 config.vm.box_url = "file:\\d:\\images\\test.box" 

我設置一個變量「代替= test_15_5」 ..和「搜索= config.vm.box」

我需要一個批處理代碼將在文件中搜索「config.vm.box」並用%替換%替換下一個字符串「test_15_4」。代碼應該替換文件中的每一處。

我已經寫了一小段代碼,但不工作:

for /F "USEBACKQ delims=" %%j in ("%textfile%") do (

set row=%%j 

IF "!row:config.vm.box=!"=="%%j" (echo %%j>>"%outputFile%") ELSE (echo %%j>>Nul && ECHO config.vm.box = "%BoxName%">>"%outputFile%") 
) 
+0

你在使用什麼環境?在Windows/Linux呢?這將決定解決方案。此外,當你有一些代碼開始時,你會發現更多的成功。 – GVashist

+0

基於'D:\ images \ test.box'和[batch-file]標記,可以肯定地說這是Windows。 – SomethingDark

+0

@GVashist,我有Windows 7.它的Windows批處理文件。我創建了一個批處理文件,它正在執行一些清理活動。我被困在這裏。我有一個輸入文件,其中包含上面的行,我需要替換特定的東西后,我發現了另一個字符串。請指導。 – user

回答

1

syntax在批處理文件替換:%variable:StrToFind=NewStr%

你的問題是一個比較複雜一點,因爲你需要加倍擴大。您可以使用delayed expansion來實現它。

for命令中使用tokens=*而不是delims=,因爲您不需要標記行。

不需要if:如果找到了搜索,則將其替換,否則保留原始文本。

setlocal EnableDelayedExpansion 

rem set variables here: INPUT, OUTPUT, SEARCH, REPLACE 

del %OUTPUT% 

for /f "tokens=*" %%T in (%INPUT%) do (
    set PROCESSEDLINE=%%T 
    >> %OUTPUT% echo !PROCESSEDLINE:%SEARCH%=%REPLACE%! 
) 

UPDATE

我試過的方式與再造與搜索文本的行。

for /f "tokens=*" %%T in (%INPUT%) do (
    set PROCESSEDLINE=%%T 
    if !PROCESSEDLINE!==!PROCESSEDLINE:%SEARCH%=! (
    rem not found 
    >> %OUTPUT% echo !PROCESSEDLINE! 
) else (
    rem found 
    >> %OUTPUT% echo %SEARCH% %REPLACE% 
) 
) 

然而,在批處理文件解釋簡單的替換機制將用含有空格等特殊字符或=搜索字符串完全混淆。在這種情況下,我寧願使用更復雜的工具來搜索和替換字符串:sed。作爲UnxUtils的一部分,它被移植到獨立的Windows應用程序中。

隨着sed,替換命令是:

sed "s/config.vm.box = .*/config.vm.box = \"test_15_5\"/" <infile.txt> outfile.txt 

它需要獨立的輸入和輸出文件,就像我上面的腳本。

+0

我沒有得到「delete%output%」這個會做什麼。 我需要替換下一個字不是相同的單詞,所以不管上述的東西會起作用嗎? 據我瞭解,它會替換搜索到的字符串,對吧? – user

+0

因爲我們正在寫一個全新的文件,所以'INPUT'和'OUTPUT'文件必須不同。使用'>>'重定向命令'echo'追加到'OUTPUT',我們必須在第一次迭代中將它追加到_nothing_。 – Melebius

+0

替換下一個單詞沒有意義。那麼搜索字符串也出現在第23行呢?剛剛重新創建以'config.vm.box ='開頭的行會不會更容易? – Melebius