2010-08-31 58 views
1

j'ai quelques fichiers qui contiennent certains d'entre sinon toutes les conditions suivantes:.bat Rechercher et remplacer du texte

Programme RxBIN RXPCN RxGroup MemberID

pas tous les fichiers auront tous les en-têtes, mais ceux qui dois-je aurai besoin de remplacer l'air si comme ceci:

@Program @RxBIN @RXPCN @RxGroup @MemberID

Merci à l'avance, Joe

+0

Je ne comprends pas très bien quel est votre objectif. Pouvez-vous être un peu plus précis? – Nate

+0

Joe vous avez demandé la même chose sur http://www.dostips.com/?t=Batch.FindAndReplace - et il semble y avoir une solution parfaitement bien postée là (ce n'est pas facile, j'utiliserais gVim, vim, ou un application spécifique de recherche/remplacement). – Rudu

+0

J'ai exporté à partir d'Excel au texte délimité (.txt) Première ligne du fichier txt je tout ou partie des éléments suivants dans la première ligne: Programme RxBIN RXPCN RxGroup MemberID ce que je dois faire est de les faire lire comme: @Program @RxBIN @RXPCN @RxGroup @MemberID Je dois trouver de la première ligne "Program" et remplacer par "@Program" et ainsi de suite. Merci d'avance, Joe – jmituzas

Répondre

2

Je serais toujours enclin à aller avec un outil construit à cet effet: Batch Replacer semble parfaitement correspondre à la facture.

Mais si vous êtes mort mis sur elle ... quelque chose en utilisant l'ancien repl.bat avec un analyseur multi arg ... cela devient un peu d'un monstre qui utilisant la commande DEBUG mais voici le dernier chef-d'œuvre:

code source:mmrepl.bat

@ECHO OFF 
setLocal EnableDelayedExpansion 

::: mmrepl - Replaces one or more strings with others, in file(s) 
::: 
::: syntax: mmrepl.bat $file $find $replace [$find $replace] ... 
:::   $file [in] - file to be parsed 
:::   $find [in] - string to find 
:::   $replace [in] - string to replace with 
::: 
:::   * $find & $replace should be supplied in pairs, n multiples allowed 
:::   * $file can be a single file (eg.txt) or a file filter (*.txt) 
:::   you can supply any command that works with 'dir /b $file' 
:::   so paths and drives are also valid. 
:::   * $find,$replace strings can be single words, or strings enclosed 
:::   in quotes (which will be stripped) 
if "%~1"=="" findstr "^:::" "%~f0"&GOTO:EOF 
if not exist %1 echo No files matching %1 found&GOTO:EOF 

::Creates the following log file: 
set log=%0.log 
::Temporarily creates the following files but cleans up 
set replscr=TEMPDEBUG.SCR 
set cmplsrc=TEMPEDLN.SCR 

echo To see the work of %0.bat view the log file %log% 
echo Multi-Multi Replacement (%0.bat)>%log% 
echo.>>%log% 
set "files=%1" 
shift 
set mmreplcmd= 
:: Pair up find/replaces 
:strippairs 
set p1=%1 
set p1=!p1:"=! 
set p2=%2 
set p2=!p2:"=! 
SET mmreplcmd=%mmreplcmd%'1R%p1%' 1A '%p2%' 0D 0A 
echo Replacing "%p1%" with "%p2%" >> %log% 
shift 
shift 
if "%~1" neq "" goto:strippairs 

::Build script 
echo N%cmplsrc% > %replscr% 
echo E CS:100 %mmreplcmd%'E' 0D 0A>> %replscr% 
echo RCX >> %replscr% 
echo 40 >> %replscr% 
echo W >> %replscr% 
echo Q >> %replscr% 
DEBUG < %replscr% > NUL 
::Execute on files 
for /f %%a IN ('dir /b %files%') do (
    echo.>>%log% 
    echo *** File: %%a >> %log% 
    EDLIN %%a < %cmplsrc% >> %log% 
) 
DEL %replscr% 
DEL %cmplsrc% 

NOTE: Je devais enlever le "est contenu" dans la recherche de repl.bat parce que vous ajoutez une esperluette à chaque titre de sorte qu'il contient toujours ... mes tests montrent que cela fonctionne très bien, mais YMMV (test).

+0

Wow, merci beaucoup! Fonctionne très bien. – jmituzas

1

Cela peut être fait avec trivialement sed (le s tream ed Itor) qui est disponible pour Windows dans severalplaces.

Cela pourrait se faire avec quelque chose comme

sed -e "s/\(Program\|RxBIN\|RXPCN\|RxGroup\|MemberID\)/@\1/g" myfile.txt > newfile.txt 

Ceci est une expression régulière qui dit essentiellement « remplacer le mot « programme » ou « RxBIN » ou « RXPCN » ou « RxGroup » ou « MemberID » , un at-sign et quel que soit le mot correspondait. "

Il existe de nombreuses commandes Unix qui ont été portées sur Windows et qui peuvent être extrêmement utiles.

+0

Les outils d'origine Unix sont généralement la meilleure option dans ces cas, en particulier si vous ne voulez pas "roll-your-own" avec Java ou C#. –