Extraire une chaine de caractere
brucine Messages postés 21779 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je cherche à extraire une chaine de caractère de type "ip" dans un fichier txt à l'aide d'un script batch
Exemple ci-dessous :
Lucas 10.55.10.22
je suis toto
GGGG
Voici mon code batch :
@echo off
setlocal enableextensions
set "file=C:\Users\lucas\Documents\script\test.txt"
for /f "tokens=1-4 delims=. " %%a in ('findstr /r /m "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" "%file%"') do (
set "ip=%%a.%%b.%%c.%%d"
goto :break
)
:break
echo Adresse IP est %ip%
endlocal
et donc celui-ci ne marche pas
Merci de votre aide
Bonne soirée
Cordialement
Windows / Chrome 109.0.0.0
- Extraire une chaine de caractere
- Extraire une video youtube - Guide
- Caractère ascii - Guide
- Caractère spéciaux - Guide
- Extraire le son d'une vidéo - Guide
- Caractere speciaux - Guide
3 réponses
Bonjour,
Ta regex est correcte, seulement tu as indiqué le commutateur /m de la commande FINDSTR, donc la commande te retourne uniquement le nom du fichier.
Ton étiquette :break est inutile, voilà comment je vois les choses :
@echo off setlocal enableextensions set "file=C:\Users\lucas\Documents\script\test.txt" set "ip=" for /f "tokens=2" %%a in ('findstr /r "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" "%file%"') do ( if not defined ip (set "ip=%%a") ) echo Adresse IP est %ip% endlocal pause
Bonjour
Je ne connais pas batch et donc je ne sais pas répondre à ta seconde question.
Par contre, j'ai une remarque sur la regex.
Elle n'est pas assez restrictive pour ne capturer que des ip, voir cet exemple https://regex101.com/r/ot7Qqy/1
Cela dit, si tu es sûr et certain que dans tes fichiers, une série de chiffres séparés par des point sera toujours une IP, elle peut suffire.
Sinon, cette regex étant fortement utilisée, on la trouve partout sur le net https://lite.qwant.com/?q=regex+ip&client=opensearch
Bonjour,
On peut en effet raffiner la Regex pour spécifier que les séries de chiffres entre les points sont non seulement numériques mais obéissent à un format particulier, mais rien ne garantira jamais dans l'absolu qu'il s'agit d'une adresse IP.
FINDSTR retournera la ligne contenant la chaîne recherchée, éventuellement la position de cette chaîne (début ou fin) mais est incapable de savoir si elle représente le deuxième ou le huitième mot (spécifié dans tokens, ici le deuxième).
Autrement exprimé, je n'ai aucun moyen de la rechercher si elle n'est pas à une position fixe, ce qui amène une question subsidiaire: dépendant de par quelle commande est obtenu le fichier texte et dans quel contexte on le souhaite, on pourra alors se servir de la sortie de la commande en question, et non plus de FINDSTR pour retourner le résultat.
Qui plus est, dans un texte qui serait "au kilomètre", cette syntaxe va échouer à retourner plusieurs adresses IP différentes qui y figureraient.
Bonjour brucine,
Effectivement FINDSTR est incapable de savoir la position de la chaîne, cependant on peut contourner ce problème en utilisant une boucle qui va analyser chaque token l'un après l'autre comme ceci :
:routine set "restant=%~1" :boucle for /f "tokens=1,* delims=/= " %%A in ("!restant!") do set "chaine=%%~A" & set "restant=%%~B" echo !chaine! | findstr /r "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" >nul && (set "ip=!chaine!" & exit /b 0) if defined restant (goto :boucle)
Bonjour Brucine
mais rien ne garantira jamais dans l'absolu qu'il s'agit d'une adresse IP.
évidemment," Minimi Azabu 192.168.1.1" pourrait très bien correspondre à une adresse postale au Japon (j'ai jamais rien compris à leur système mais en gros c'est des divisions de secteurs successives), mais son format correspond aussi à un IP v4.
Alors 1...1 qui ne correspond pas à une IP v4 est capturé par la regex actuelle, c'était juste cela que je voulais faire remarquer
On peut faire une autre Regex qui vérifie que chaque segment contient de 1 à 3 chiffres sans autre donnée, qu'il ne s'y trouve pas de valeur numérique aberrante concernant une IP (par exemple 964.12.178.453), qu'il n'y a pas de caractère parasite par exemple alphabétique avant ou après (A192...), qui sera moins "mauvais" mais pas non plus garanti 100%.
La seule manière d'avoir une telle garantie est d'extraire les IP réelles via Netstat, Netsh, Ipconfig, Powershell, wmic ou ce qu'on voudra dirigeant cette IP (dont on connaît alors l'emplacement dans la sortie) vers une variable.
Ok je vous remercie ce code fonctionne !! mais je me rends compte que ce code prend en compte une position fixe dans le texte, n'est il pas possible de rechercher librement une chaine de type "ip" dans un texte peut importe sa position ?
Merci de votre aide
Ok dernier question enfaite je cherche à réaliser cela sur un fichier de configuration pour l'application xemelios, ses paramètres sont stockés dans un fichier de conf :
user=xemelios
password=Am/xL6*::
database.url=jdbc\:mysql\://10.55.1.17/xemelios?jdbcCompliantTruncation\=false&dumpQueriesOnException\=true
driver.class=com.mysql.jdbc.Driverv
alidation.query=SELECT
Mon but étant de capturer l'adresse IP présente dans le fichier de configuration et la stocker dans une variable, cette IP peut varier en fonction des fichiers de configuration d'ordinateur
Voilà et tout sa en batch, ce que je demandais précédemment servais pour test
Merci
Comme ça:
for /f "tokens=2 delims=^//" %%a in ('findstr /r "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" "%file%"') do (
if not defined ip (set "ip=%%a")
Ok c'est parfait ça me va
Merci ????
C'est possible en faisant preuve d'imagination :