Partage
  • Partager sur Facebook
  • Partager sur Twitter

[BATCH] Remplacer une ligne dans un fichier texte

Contenant caractères spéciaux, lignes vides

Sujet résolu
13 juillet 2023 à 18:44:34

Bonjour à tous,

Je me permets de me tourner vers vous pour m'aider à compléter mon code batch.

Avec celui-ci je souhaite tout simplement remplacer une ligne précise d'un fichier .txt tout en gardant les autres lignes intactes ! Sachant que ces dernières peuvent contenir des caractères spéciaux tel que : & é " etc..., ou bien contenir uniquement un espace ou encore être complètement vides !

A savoir que mon fichier "settings.txt" contient ceci pour le test et que la 6e ligne contient uniquement un espace :
1
 2
AZERTY

azerty
 
&é"
0=^0
FINI


Voici un petit aperçu de mon code :

@echo off
setlocal enabledelayedexpansion

set fichier=settings.txt
set fichiertemp=settingstmp.txt
set lignearemplacer=2

for %%a in (%fichier%) do (
    set lignescan=1
    for /F "delims=" %%b in (%%a) do (
        if "!lignescan!"=="1" (
            if !lignescan! EQU !lignearemplacer! (echo YOUPI>%fichiertemp%) else (echo.%%b>%fichiertemp%)
        ) else (
            if !lignescan! EQU !lignearemplacer! (echo YOUPI>>%fichiertemp%) else (echo.%%b>>%fichiertemp%)
        )
        set /a lignescan+=1
    )
)
del /f settings.txt
ren settingstmp.txt settings.txt
pause
exit



Avec ce code, ça fonctionne bien, il suffit juste d'inscrire le numéro de la ligne à remplacer dans la variable "set lignearemplacer=" et le tour est joué.
Seul problème,  le programme ne retranscrit pas les lignes vides dans le fichier .txt généré !!

Et si j'utilise une autre approche de ce style :

for /F "delims=" %%b in ('findstr /n .* %%a') do (

Cela fonctionne très bien mais si j'intègre l'option tokens= pour récupérer uniquement le résultat après les 2 petits ponts comme ceci :

for /f "tokens=2 delims=:" %%b in ('findstr /n .* %%a')

la ligne vide disparaît de nouveau dans le nouveau fichier .txt...


Merci dans l'attente de vos réponse. ;)



-
Edité par susu52HM 13 juillet 2023 à 21:32:39

  • Partager sur Facebook
  • Partager sur Twitter
14 juillet 2023 à 1:59:37

Bonsoir,

Le plus simple est peut-être d'ajouter une condition du style : if "%%b"=="" (echo.>>%fichiertemp%) afin d'ajouter une ligne vide.

  • Partager sur Facebook
  • Partager sur Twitter
14 juillet 2023 à 6:39:26

Le code suivant fonctionne avec une ligne ayant un espace. Je n'ai pas trouvé comment avec une ligne vide.
 
@echo off
setlocal enabledelayedexpansion
set file=test.txt
set line=1
for /f "tokens=*" %%l in ('type %file%') do (
    if "!line!" == "3" (
        echo hahaha
    ) else (
        echo %%l
    )
    set /a line=!line!+1
)
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

14 juillet 2023 à 17:59:55

Dans un premier temps merci à vous 2 pour vos propositions !

En ce qui concerne d'ajouter la condition :

if "%%b"=="" (echo.>>%fichiertemp%)

J'ai déjà essayé mais sans succès... Du moins je n'ai pas réussi à intégrer une ligne vide dans un .txt avec cette commande (ou peut être que je m'y prend mal..)
De plus j'ai un peu de mal à voir comment l'intégrer à mon code dans le cas présent.
Si jamais tu repasses par là Zaibai, je suis à l'écoute de ton aide ainsi que tes propositions !



En ce qui concerne ton code PierrotLeFou, il ne respecte pas les espaces ni les lignes vides et indique "Commande echo désactivée" dans le fichier .txt. Mais à voir si jamais une idée me vient, pour l'instant il ne me permets pas de faire ce que je recherche mais merci à toi aussi d'avoir pris le temps d'écrire !!!

-
Edité par susu52HM 14 juillet 2023 à 20:14:57

  • Partager sur Facebook
  • Partager sur Twitter
14 juillet 2023 à 21:27:02

Bonsoir,

J'ai retrouvé ceci, ça devrait te convenir :

@echo off
echo.

REM Fichier de configuration
set file_tmp=provFile.ini

::::::::::::: VARIABLE A MODIFIER :::::::::::::
	REM Correspond à l'emplacement/chemin du fichier à modifier (/!\ Le nom de fichier ne doit pas être spécifié dans cette variable; pas de guillemets)
	set path_file=C:\Users\XXX
	
	REM Correspond au nom de fichier avec une ligne à modifier (pas de guillemets)
	set file=settings.txt

	REM Correspond à la ligne recherchée (numéro de ligne ; pas de guillemets)
	set /a file_line_number=2

	REM Correspond à la nouvelle ligne (pas de guillemets)
	set file_line_replace=Ce Que Je Veux Mettre Pour Remplacer La Ligne
::::::::::::: VARIABLE A MODIFIER :::::::::::::

cd /D "%path_file%"
If not exist "%file%" (goto :file_notfound)
If exist "%file_tmp%" (del /F /Q "%file_tmp%")

(FOR /f "tokens=1* delims=:" %%a IN ('findstr /n "^" "%file%"') DO (
    SET "Line=%%b"
    IF %%a equ %file_line_number% SET "Line=%file_line_replace%"
    setlocal EnableDelayedExpansion
    ECHO(!Line!
    endlocal
))>"%file_tmp%"
)

del /F /Q "%file%"
rename "%file_tmp%" "%file%"
echo Modification termin‚e ^!
goto :quit

:file_notfound
echo Le fichier "%file%" est introuvable ^!

:quit
echo.
pause>nul | echo Appuyez sur une touche pour quitter le script...
exit



  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2023 à 14:28:09

Bonjour Zaibai,

Une véritable merveille ton code !!! Je ne sais pas où tu as déniché ça ou si c'est toi qui l'as fait mais en tout cas c'est exactement ce qu'il me fallait ! T'es le meilleur !!!

Un immense merci pour tes recherches ainsi que le temps que tu m'as consacrer !!

Bonne journée ! ;)


  • Partager sur Facebook
  • Partager sur Twitter
24 avril 2024 à 20:25:40 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


24 avril 2024 à 20:46:05

@BertPeaude Bonjour, merci de ne pas squatter le sujet résolu d'un autre, créer votre propre sujet pour une nouvelle question.

Je ferme ce déterrage.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Liens conseillés

  • Partager sur Facebook
  • Partager sur Twitter