Ajouter un mot en début de ligne spécifique

Ajouter un mot en début de ligne spécifique Ajouter une mot en fin de ligne (Résolu) » Forum - Linux / Unix Ajouter un mot au debut de 100,000,000 mots » Forum - Programmation Notepad++ chercher et si résultat ajoute un mot au début de la l » Forum - Programmation Espace entre deux mots en début et fin de ligne (Résolu) » Forum - Word [linux/shell] inserrer texte en début ligne (Résolu) » Forum - Programmation

Bonjour,

Je souhaiterai commenter (en ajoutant une dièse en début de ligne) automatiquement des lignes contenant des lettres précise dans un fichier ini.

Par exemple je souhaiterai commenter une ligne qui contient les lettres "mysql", la ligne peut donc contenir le mot "mysql_cluster" ou encore "variable_mysql"..

La seule chose que j'arrive à faire actuellement c'est de supprimer les lignes en question avec la commande ci-dessous, je n'ai pas trouvé mieux :(

Type %fichier% |Findstr /v "mysql" > %ftemp%


Si vous avez des idées je suis preneur,

Merci.

Forum

Ajouter un mot en début de ligne spécifique Ajouter une mot en fin de ligne (Résolu) » Forum - Linux / Unix Ajouter un mot au debut de 100,000,000 mots » Forum - Programmation Notepad++ chercher et si résultat ajoute un mot au début de la l » Forum - Programmation Espace entre deux mots en début et fin de ligne (Résolu) » Forum - Word [linux/shell] inserrer texte en début ligne (Résolu) » Forum - Programmation

Web: www.shapebootstrap.net

10 réponses

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

Bonjour,

Essaie comme ça :

for /f "usebackq delims=" %%A in ("%fichier%") do (
echo %%A | findstr "mysql" && echo # %%A >> %ftemp% || echo %%A >> %ftemp%
)


Reply
réponses:
  • auteur

  • auteur

    Bonjour barnabe,

    Merci beaucoup cela fonctionne bien en effet !

    le usebackq est nécessaire pour ajouter un guillemet derrière le delims afin de préciser que le caractère délimiteur c'est le saut de ligne c'est ça ?

    Je demande car j'essais de comprendre votre code et souhaiterai que les sauts de ligne soit également insérés dans le fichier texte de destination mais je n'y arrive pas après plusieurs essais infructueux.

  • barnabe0057

    Le usebackq sert à indiquer à la boucle FOR qu'il s'agit d'un fichier ("%fichier%") et pas d'une chaine de caractères.

  • barnabe0057

    Voilà la modif que tu souhaites :

    for /f "usebackq delims=" %%A in ("%fichier%") do (
    if not defined %%A (echo. >> %ftemp%)
    echo %%A | findstr "mysql" && echo # %%A >> %ftemp% || echo %%A >> %ftemp%
    )

  • auteur

    Bonjour Barnabe,
    Merci pour l'explication je comprend mieux pourquoi ma variable correspondait au nom du chemin du fichier plutôt qu'à l'intérieur sans le usebackq.

    Merci pour la modif !
    If not defined ne correspond pas tout à fait à mon besoin car il met un saut de ligne a chaque ligne et je souhaiterai un saut de ligne uniquement lorsque sur le fichier source il y en a un.

    J'ai modifié le script afin qu'il n'y ait pas de saut de ligne lorsque la ligne commence par un #, l'idéal serait qu'il fasse un saut de ligne lorsque la ligne commence par un caractère vide mais je ne trouve pas comment faire.


    SETLOCAL ENABLEDELAYEDEXPANSION
    for /f "usebackq delims=" %%A in (%fichier%) do (
    set firstchar=%%A
    set firstchar=!firstchar:~0,1!
    if !firstchar! EQU # echo. >> %ftemp%
    echo %%A | findstr "mysql" && echo # %%A >> %ftemp% || echo %%A >> %ftemp%
    )

  • barnabe0057

    Essaie comme ça :

    if "A!firstchar!A"=="A A" echo. >> %ftemp%

  • auteur

    Bonjour, merci pour cette bonne idée.
    L' ennuie c'est que la ligne vide ne rentre pas dans la boucle for /f
    Donc %%A n'est jamais égal à rien.
    J'ai vu sur ce forum qu'ils ont l'air d'avoir réussi à prendre en compte les sauts de lignes dans la boucle for : https://stackoverflow.com/questions/38723595/preserve-empty-lines-in-a-text-file-while-using-batch-for-f

    Mais je n'ai pas réussi à l'adapter à mon code, j'obtiens des chiffres 1:, 2:, 3: devant chaque ligne.

  • barnabe0057

    Avec un peu d'imagination ça donne ça :

    @echo off
    setlocal enableextensions disabledelayedexpansion

    cd %USERPROFILE%\Desktop

    set ftemp=
    set fichier=

    echo. >%ftemp%

    >%ftemp% (
    for /f "tokens=1,* delims=:" %%i in ('findstr /n "^" "%fichier%"') do (
    (echo(%%j | findstr "mysql" >nul) && echo(# %%j || echo(%%j
    )
    )

  • auteur

    Bonjour Barnabe,

    Merci beaucoup pour votre code :D, cela fonctionne très bien mais je n'arrive pas à comprendre entièrement son fonctionnement.

    Apparemment il n'y a pas besoin de faire le premier echo. >%ftemp% car le fichier ftemp se créé avec la commande >%ftemp%

    J'essaie n'analyser votre code, pourriez vous me donner votre avis :

    - findstr /n , "/n" ajoute un chiffre suivi du caractère ":" devant chaque lignes même si elles sont vides, ce qui permet de récupérer toutes les lignes même les vides

    - delims=: précise qu'il faut rechercher ce qu'il y a entre les caractère ":"
    -
    tokens=1,* "1" permet de dire qu'on recherche ce qu'il y avant le caractère ":" cela sera la variable %%i, même si on affiche pas %%i cela permet que les lignes vides soient prise en comptes
    "*" permet de mettre tout ce qu'il y a après le premier delimiteur ":" dans la variable suivant le "%%i", donc "%%j"

    - Je n'arrive pas à comprendre le cheminement des différentes parenthèses :

    echo (%%j | findstr "mysql" >nul)
    findstr cherche la chaine mysql dans le echo et la supprime

    && echo(# %%j || echo(%%j)
    && récupère ce qui est renvoyé entre les parenthèse du précédent echo, si le findstr s'est executé il fait un echo sinon il passe à ||, c'est une condition IF implicite ? Je n'arrive pas a comprendre son fonctionnement.

    Aussi, j'observe que la parenthèse devant le premier echo peut être enlevé et j'obtiens le même résultat.

    Merci encore.

  • barnabe0057

    Tu as bien compris le fonctionnement de FINDSTR et de la boucle FOR.

    echo (%%j | findstr "mysql" >nul)
    findstr cherche la chaine mysql dans le echo et la supprime

    ==>> cette commande recherche uniquement les lignes contenant mysql

    && echo(# %%j || echo(%%j)
    ==>> c'est effectivement une condition, si la commande précédente s'est déroulée correctement on exécute ce qui se trouve après le &&, si elle s'est mal déroulée on exécute se qui se trouve après le ||

    Il y a plusieurs manières d'écrire le ECHO, voilà une documentation très précieuse :
    https://www.developpez.net/forums/d876934/general-developpement/programmation-systeme/windows/scripts-batch/breve-explication-quelques-notions-basiques/

    Pour aller plus loin :
    https://www.developpez.net/forums/d861260/general-developpement/programmation-systeme/windows/scripts-batch/trucs-astuces-divers/

    ps : effectivement c'est un oubli de ma part, il n'y a pas besoin de faire le premier echo. >%ftemp%

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed