2012-01-31 5 views
1

Je dois trouver toutes les lignes contenant myfile.txt mot « myWord », puis remplacer une partie de cette chaîne suivante façon:CMD de script pour rechercher et remplacer une partie de la ligne trouvée dans le fichier

ligne d'origine:

...,31-01-2012,00,some_words_and_symbols_and_digits,MyWord,... 

Après remplacer:

...,31-01-2012,01,some_words_and_symbols_and_digits,MyWord,... 

S'il vous plaît, aidez-moi d'écrire ce script cmd!

OK .. J'ai le code suivant:

@echo off 
set code=MyWord 
set req=new request 

FOR /F "usebackq delims=, tokens=1,2,3,4,5,6,7,8,9*" %%a in (MyFile.txt) do (

IF %%h==%code% (
    SET tempstr=%%a,%%b,%%c,%%d,60,%%f,%%g,%%h,%%i 
    ) ELSE (
    SET tempstr=%%a,%%b,%%c,%%d,%%e,%%f,%%g,%%h,%%i 
    ) 

IF %%a==%req% (
    SET echo %%a >> new.strings 
    ) ELSE (
    echo %tempstr% >> new.strings 
    ) 

) 
@echo on 

Et je dans mon dossier quelque chose comme:

new request 
...,31-01-2012,01,some_words_and_symbols_and_digits,MyWord,... 
new request 
...,30-11-2011,01,some_words_and_symbols_and_digits,OtherWords,... 

Mais j'ai erreur:

ELSE was unexpected at this time. 

Et Si J'essaie simple ensuite à la fin

IF %%a==%req% SET tempstr=%%a 
echo %tempstr% >> new.strings 

Alors je ne dispose que d'une dernière ligne au lieu d'un autre autre

+0

je modifier ma réponse en réponse à votre modification. La prochaine fois s'il vous plaît laissez un commentaire comme une notification que stackoverflow n'informe pas les utilisateurs sur les modifications aux questions auxquelles ils ont répondu. – MBu

Répondre

1

Vous pouvez utiliser la commande find pour filtrer les lignes contenant du texte donné. Comme je le vois, le fichier est CSV. Vous pouvez donc utiliser for /f pour analyser les lignes trouvées. Ensuite, vous pouvez echo tous les fichiers analysés en remplaçant le champ que vous voulez.

Cela remplacera toutes les valeurs dans la 3ème colonne avec « 01 »

@echo off 
for /f "usebackq delims=, tokens=1,2,3,4,<put as many as you need>" %%A in (`find "MyWord" myfile.txt`) do echo %%A,%%B,01,%%D,<as many %%letters as tokens> 

Si vous voulez remplacer la valeur que sur certaines lignes, vous pouvez utiliser la commande if boucle à l'intérieur for /f.

==== EDIT

Le problème est à la valeur de la variable req. Il contient un espace, donc après la substitution de votre deuxième instruction if a la forme suivante:

IF %%a==new request (

donc si %%a est égal à new il exécutera request (echo ......) et encore est en effet inattendu. Entourez les deux %%a et %req% entre guillemets et le problème disparaîtra.

Mais je vois aussi d'autres problèmes. Tout d'abord, vous avez redondant set dans votre seconde instruction if. Deuxièmement, vous devez utiliser l'expansion différée des variables, ou votre echo %tempstr% ne fonctionnera pas.

Votre code change après nécessaires:

@Echo off 
setlocal enabledelayedexpansion 

set code=MyWord 
set req=new request 

FOR /F "usebackq delims=, tokens=1,2,3,4,5,6,7,8,9*" %%a in (MyFile.txt) do (

    IF %%h==%code% (
    SET tempstr=%%a,%%b,%%c,%%d,60,%%f,%%g,%%h,%%i 
) ELSE (
    SET tempstr=%%a,%%b,%%c,%%d,%%e,%%f,%%g,%%h,%%i 
) 

    IF "%%a"=="%req%" (
    echo %%a >> new.strings 
) ELSE (
    echo !tempstr! >> new.strings 
) 
) 

endlocal 
Questions connexes