2 votes

Batch pour trouver une chaîne de combinaison de chiffres et de lettres uniquement dans les 10 premiers caractères (dans un fichier txt) par ligne et imprimer la ligne entière.

J'ai une question concernant le fichier batch. J'ai besoin d'un fichier batch qui trouvera une chaîne de combinaison de chiffres et de lettres dans les 10 premières lettres par ligne (dans plusieurs fichiers .txt) et imprimera la ligne entière dans un fichier .txt de sortie. Pour l'instant, j'ai utilisé ceci :

@echo off  
findstr "A1234 B5678" "*.txt"  
for /f "delims=" %%A in ('findstr "A1234 B5678" "*.txt"') do (echo %%A >> OUTPUTFILE.txt) 

Ce que je recherche dans ce qui précède, c'est une combinaison des lettres A1234 et B5678 (juste un exemple) dans tous les fichiers txt du répertoire et leur impression dans outputfile.txt. Cela fonctionne très bien mais je dois l'améliorer un peu. Je veux seulement que le batch trouve cette combinaison (A1234 et B5678) dans seulement les 10 premières lettres par ligne et imprime la ligne entière dans un fichier txt de sortie. Par exemple, nous aurions plusieurs fichiers txt qui contiendraient des lignes comme celles-ci :

00 A1234 QWERTZ  
AA B5678 ASDFGH

Batch vérifie dans tous les fichiers la combinaison de chaînes A1234 et B5678 et imprime toutes les lignes contenant cette combinaison.
J'espère que vous me comprendrez, car mon anglais n'est pas le meilleur. En outre, je ne suis pas très expérimenté en cmd, donc si possible, s'il vous plaît faire aussi facile (compréhensible) que possible :).
Merci beaucoup !

0voto

ab77 Points 672

Si vous ne voulez absolument pas utiliser cmd, vous pouvez utiliser findstr avec le drapeau regex comme suit :

C:\>type test.txt
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678

C:\>findstr /R "^*[A][0-9]* [B][0-9]*$" test.txt
BB A1234 B5678
BB A1234 B5678
BB A1234 B5678
BB A1234 B5678
BB A1234 B5678
BB A1234 B5678
BB A1234 B5678

-- ab1

0voto

Thomas Points 595

Si j'ai bien compris, vous voulez rechercher dans les 10 premiers caractères plusieurs combinaisons alphanumériques spécifiques. Je pense que vous pouvez le faire avec une expression régulière, mais malheureusement, findstr ne peut pas gérer les motifs alternatifs.

findstr /r "(pattern1|pattern2)"

ne fonctionne pas. Vous devez donc passer à grep pour Windows qui se trouve à l'adresse suivante aquí La syntaxe pour les motifs n est :

grep -h -E -e "^.. ({PATTERN 1}|{PATTERN 2}|...|{PATTERN 2})" *.txt

Ainsi, pour votre exemple, vous pouvez utiliser :

grep -h -E -e "^.. (A1234|B5678)" *.txt

recherche dans chaque *.txt toute ligne qui commence par 2 lettres aléatoires suivies d'un espace puis de A1234 ou B5678 et imprime cette ligne. Le -h au début supprime la sortie du nom de fichier de la ligne.

0voto

foxidrive Points 19298

Ceci utilise un fichier batch d'aide appelé findrepl.bat qui est similaire à grep mais s'exécute comme un simple fichier batch - vous le trouverez ici - http://www.dostips.com/forum/viewtopic.php?f=3&t=4697

findrepl.bat utilise jscript dans le Windows Scripting Host et cela fonctionnera, sauf si votre administrateur informatique a désactivé WSH.

@echo off 
for %%a in (*.txt) do (
echo ============="%%a"================>>search
type "%%a"|findrepl "^.. (A1234|B5678)">>search 
)
ren search search.txt

0voto

Thomas Points 595

Il existe une autre façon de procéder, un peu plus compliquée, mais qui ne nécessite pas de code supplémentaire. Elle découpe tous les fichiers txt du répertoire courant en lignes. Les 10 premiers caractères de ces lignes sont introduits dans findstr. Si findstr réussit, il envoie la ligne à la console.

Utilisez le fichier batch suivant :

@echo off
setlocal
for /f "delims=" %%I in ('dir/B *.txt') do (
    for /f "delims=" %%J in (%%I) do (
        set "_=%%J"
        call echo %%_:~0,10%%|findstr "PATTERN1 PATTERN2"&&call echo %%_%%
    )
)
endlocal
goto:eof

Pour les fissures : Je sais qu'il y a ENABLEDELAYEDEXPANSION. Donc le style d'appel pourrait être évité en utilisant

setlocal ENABLEDELAYEDEXPANSION

et

        echo !_:~0,10!|findstr "PATERN1 PATERN2"&&call echo !_!

Mais je considère que c'est un mauvais style, parce que cela a tendance à causer des problèmes, surtout si ce que vous voulez répercuter inclut " !". J'utilise donc toujours le style call et double %% dans mes exemples, sauf que la DELAYEDEXPANSION ne peut être évitée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X