2014-04-15 5 views
25

Ho scritto uno script batch per sostituire una stringa nel file di testo.Script batch per trovare e sostituire una stringa in un file di testo in un minuto per file fino a 12 MB

Di seguito è riportata la sceneggiatura.

@echo off &setlocal 
set "search=%1" 
set "replace=%2" 
set "textfile=Input.txt" 
set "newfile=Output.txt" 
(for /f "delims=" %%i in (%textfile%) do (
    set "line=%%i" 
    setlocal enabledelayedexpansion 
    set "line=!line:%search%=%replace%!" 
    echo(!line! 
    endlocal 
))>"%newfile%" 
del %textfile% 
rename %newfile% %textfile% 

Ma per un file da 12 MB, ci vogliono quasi 7 minuti. Voglio che sia sotto un minuto. Possiamo utilizzare il comando find o findstr per ridurre il tempo impiegato?

+0

ti dispiacerebbe, raccontando i diversi tempi, Theat le diverse soluzioni hanno bisogno per il file di 12MB? Solo per nutrire la mia curiosità. – Stephan

+0

Non credo che il file batch sia adatto a requisiti di prestazioni così elevati. Usa altri linguaggi di scripting come python, perl, ruby ​​... invece –

risposta

24

Dare a questo un colpo:

@echo off 
setlocal 

call :FindReplace "findstr" "replacestr" input.txt 

exit /b 

:FindReplace <findstr> <replstr> <file> 
set tmp="%temp%\tmp.txt" 
If not exist %temp%\_.vbs call :MakeReplace 
for /f "tokens=*" %%a in ('dir "%3" /s /b /a-d /on') do (
    for /f "usebackq" %%b in (`Findstr /mic:"%~1" "%%a"`) do (
    echo(&Echo Replacing "%~1" with "%~2" in file %%~nxa 
    <%%a cscript //nologo %temp%\_.vbs "%~1" "%~2">%tmp% 
    if exist %tmp% move /Y %tmp% "%%~dpnxa">nul 
) 
) 
del %temp%\_.vbs 
exit /b 

:MakeReplace 
>%temp%\_.vbs echo with Wscript 
>>%temp%\_.vbs echo set args=.arguments 
>>%temp%\_.vbs echo .StdOut.Write _ 
>>%temp%\_.vbs echo Replace(.StdIn.ReadAll,args(0),args(1),1,-1,1) 
>>%temp%\_.vbs echo end with 
+0

ottimo uno +1 – SachaDee

+1

Che bello! Peccato che non supporti i file unicoded però. – Clox

+1

Questo funziona per me! Perché mette un lucchetto vicino al nome del file in Windows Explorer? –

6

Una variante utilizzando Bat/PowerShell (bisogno .net framework):

replace.bat:

@echo off 

call:DoReplace "Findstr" "replacestr" test.txt test1.txt 
exit /b 

:DoReplace 
echo ^(Get-Content "%3"^) ^| ForEach-Object { $_ -replace %1, %2 } ^| Set-Content %4>Rep.ps1 
Powershell.exe -executionpolicy ByPass -File Rep.ps1 
if exist Rep.ps1 del Rep.ps1 
echo Done 
pause 
+1

Questo script mi ​​restituisce un errore che non è possibile caricare Rep.ps1. Reo.ps1 non è firmato digitalmente. Lo script non verrà eseguito sul sistema. –

+0

Come eseguire questo script senza firmare digitalmente lo script? –

+0

Controlla il mio EDIT. E provalo ancora – SachaDee

8

Questo utilizza un file batch di aiuto chiamato repl.bat - download da: https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

luogo repl.bat nella stessa cartella del file batch o in una cartella sul percorso.

Repl.bat è un file batch ibrido che utilizza script nativi di Windows ed è molto più veloce di uno script batch regolare.

L'opzione L effettua la ricerca del testo e sostituisce una stringa letterale e mi aspetto che il file da 12 MB venga completato in diversi secondi su un PC moderno.

@echo off &setlocal 
set "search=%~1" 
set "replace=%~2" 
set "textfile=Input.txt" 
set "newfile=Output.txt" 
call repl.bat "%search%" "%replace%" L < "%textfile%" >"%newfile%" 
del "%textfile%" 
rename "%newfile%" "%textfile%" 
+0

Hai bisogno di uno specchio per quello script repl.bat !! –

+1

@WilliamOliver ROFL! Grazie per l'avviso: quell'account ha 7 script batch e un piccolo file zip da 140 KB. Ho chiesto di vedere le statistiche sul traffico per capire perché la condivisione è stata disabilitata - non ho ricevuto alcun avviso al riguardo e apparentemente sta generando oltre 20 GB o 100.000 download al giorno per la condivisione da disabilitare. ;) Trova due degli script qui: Repl.bat: http://www.dostips.com/forum/viewtopic.php?f=3&t=3855 e Jrepl.bat: http://www.dostips.com/forum /viewtopic.php?f=3&t=6044 – foxidrive

+0

@WilliamOliver Dropbox mi ha finalmente comunicato che su Aacini_tools.zip era presente un flag di malware. È un falso positivo da alcune scansioni euristiche: il file è stato su server Dropbox per 2,5 anni. Mi è stato richiesto di cancellare il file e l'account dovrebbe essere riattivato a breve. Sto solo seguendo qui. – foxidrive

4

Che ne dici, gente?

set search=%1 
set replace=%2 
set textfile=Input.txt  

set line1=with open('%textfile%', 'rw') as f: 
set line2=f.write(f.read().replace('%search%', '%replace%')) 
python -c "%line1%%line2%" 

Muhahaha


Edit:

In un folle oneliner

python -c "with open('%textfile%', 'rw') as f: f.write(f.read().replace('%search%', '%replace%'))" 
4

Prova questo:

@echo off &setlocal 
setlocal enabledelayedexpansion 

set "search=%1" 
set "replace=%2" 
set "textfile=Input.txt" 
set "newfile=Output.txt" 
(for /f "delims=" %%i in (%textfile%) do (
    set "line=%%i" 
    set "line=!line:%search%=%replace%!" 
    echo(!line! 
))>"%newfile%" 
del %textfile% 
rename %newfile% %textfile% 
endlocal 
+2

Questo è quasi esattamente lo stesso script degli OP, ma questo distrugge i punti esclamativi – jeb

4

Basta scaricare scoreggia (trovare e sostituire testo) da here

usarla in CMD (per facilità d'uso aggiungo cartella scoreggia alla mia variabile PATH)

Ecco un esempio:

fart -r "C:\myfolder\*.*" findSTR replaceSTR 

questo comando cercherà in C: \ myfolder e tutte le sottocartelle e sostituirà findSTR con replaceSTR

-r significa processare le sottocartelle in modo ricorsivo.

peto è veramente facile e veloce