IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Gestion de lignes vide avec la commande sed [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut Gestion de lignes vide avec la commande sed
    Salut

    J'ai la version 3.59 de la commande sed.

    "%#problems1%" et "%#problems2%" pointent vers deux fichiers txt (les guillemets sont là pour régler le problème des espaces dans les chemins).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call %_commands%\sed\sed.exe "/^$/d" "%#problems%">"%#problems2%"
    C'est quand même pas compliqué non?

    Eh bah si !

    Au lieu de virer les lignes vides et de rebalancer le tout sur le fichier "%#problems2%", il rebalance tout AVEC les lignes vides -___-

    Pfff...

    Je précise que les lignes sont bien vides (pas d'espace), et affichent [CR][LF] dans Notepad++...

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    Bon apparemment il est tout naze mon .exe, il fait rien.

    J'ai réussi à chopper une version 4, mais faut l'installer, hors le principe de mon batch c'est de fournir les commandes et qu'il se débrouille avec.

    J'ai donc extrait le contenu du setup avec Universal Extractor, et j'ai tout copié dans le répertoire de mon batch.

    Mais ça ne change rien, ça refuse toutjours de virer les lignes vides !

    O__o

  3. #3
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "/^$/d" espace.txt > sans_espace.txt
    fonctionne bien, j'utilise la version 4.2 de SED
    essayes le contraire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n "/./p" espace.txt >sans_espace.txt
    ou bien upgrade ta commande

    sinon, tu peux aussi utiliser la boucle FOR elle supprimera toutes les lignes vides de ton fichier

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    Je viens de remarquer que j'ai une version win32, mais qu'il y a des version DOS. Serait-ce l'explication quant au malfonctionnement?

    Où puis-je télécharger une version DOS, tous les liens que donne google sont mort...

    Et comment faire pour virer des lignes vides avec une boucle for?

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par DeVit Voir le message
    Et comment faire pour virer des lignes vides avec une boucle for?
    C'est le comportement par défaut d'une boucle FOR, elle ignore les lignes vides lors du parcours... Tu vas donc t'en sortir avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type NUL>%fichier2%
    for /F "tokens=* delims=" %%i in ('type %fichier1%') do (
      echo %%i>>%fichier2%
    )
    (Pas testé, j'ai écris ça à l'arrache).
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    1er question: depuis ma signature
    2eme question: depuis l'option la rechercher du forum

  7. #7
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    C'est le comportement par défaut d'une boucle FOR, elle ignore les lignes vides lors du parcours... Tu vas donc t'en sortir avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type NUL>%fichier2%
    for /F "tokens=* delims=" %%i in ('type %fichier1%') do (
      echo %%i>>%fichier2%
    )
    (Pas testé, j'ai écris ça à l'arrache).
    t'es trop rapide pour moi

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par I'm_HERE Voir le message
    t'es trop rapide pour moi
    C'est pour les fois où c'est toi qui m'a grillé...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    Citation Envoyé par DeVit Voir le message
    Bon apparemment il est tout naze mon .exe, il fait rien.

    J'ai réussi à chopper une version 4, mais faut l'installer, hors le principe de mon batch c'est de fournir les commandes et qu'il se débrouille avec.

    J'ai donc extrait le contenu du setup avec Universal Extractor, et j'ai tout copié dans le répertoire de mon batch.

    Mais ça ne change rien, ça refuse toutjours de virer les lignes vides !

    O__o
    une autre solution,

    utiliser FINDSTR avec ses RegExp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    findstr /vir "^$" espace.txt > sans_espace.txt

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    Nan, perdu les gars

    Vous avez oublié qu'en copiant les lignes "pleines" du fichier "problems.txt" vers un autre fichier, via une boucle for, on perds les caractères spéciaux !

    C'est de ma faute, j'ai oublié de relier ce topic à celui-ci.

    utiliser FINDSTR avec ses RegExp
    Du coup même problème, puisqu'on tente de copier les lignes contenant des caractères spéciaux...

  11. #11
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    Citation Envoyé par DeVit Voir le message

    Vous avez oublié qu'en copiant les lignes "pleines" du fichier "problems.txt" vers un autre fichier, via une boucle for, on perds les caractères spéciaux !
    sincèrement, j'ai pas compris,..tu veux virer les lignes vides ou pas..si c'est ça alors une boucle FOR peux bien faire ça..si tu as trouvé un problème donne nous une partie de ton fichier avec_espaces.txt

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    Oui, je veux virer les lignes vides d'un fichier, qui contient :
    - des lignes vides
    - et des lignes contenant des chemins avec caractères spéciaux que je me suis fait suer à obtenir via une astuce avec la commande "dir"

    ... sans avoir à bouger les lignes pleines dans un autre fichier, sous peine de perdre les caractères spéciaux !

    Donc en gros il me faut simplement une commande qui daigne fonctionner -_- et qui aura pour fonction de supprimer les lignes vides du fichier (et rien d'autre).

    edit : la version 4.2 de sed, je l'ai téléchargée sur le site que tu as en signature, et elle ne marche pas chez moi !

  13. #13
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    c:\>cat infile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    BEGIN
    
    ^ ^ ^
    
    % % %
    
    | | |
    
    < < <
    
    > > >
    
    & & &
    
    
    
    END
    Ces 3 codes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1- findstr /vir "^$" infile >outfile
    2- <infile sed -n "/./p" >outfile
    3- <infile sed "/^$/d" >outfile
    retournent tous le bon resultat:

    c:\>cat outfile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BEGIN
    ^ ^ ^
    % % %
    | | |
    < < <
    > > >
    & & &
    END
    EDIT: sans oublier la boucle FOR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for /f "delims=" %%a in (infile) do echo/%%a >>outfile

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    -suppression de mon message-

    ok ça marche.

    Sauf pour le "!"

    Alors un chemin :
    C:\Documents and Settings\Administrateur\Bureau\test\JOUER !.lnk
    ne sera pas copié tel quel.

    Mais le truc que j'trouve hallucinant, c'est que si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for /f "useback delims=" %%a in ('dir "%rep%"') do (
    if exist "%%a" echo CA EXISTE
    if not exist "%%a" echo %%a>problems.txt
    )
    et que "rep" est un répertoire contenant un fichier :
    il ne me retournera pas "CA EXISTE" pour le fichier en question, et je vais retrouver le chemin du fichier, sans ses parenthèses, dans le fichier "problems.txt".

    Par contre si je sors une commande :
    et que je fais la boucle dont tu m'as parlé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /f "useback delims=" %%a in (file.txt) do echo/%%a>file2.txt
    il aura aucun problème à copier la ligne contenant les parenthèses !!!


    Je comprend plus rien : dans les deux cas on a une variable "%%a" qui contient un chemin avec un caractère spécial. Dans le premier cas la variable %%a pose problème pour la vérification de la condition "if exist", mais dans le 2e cas elle ne pose absolument pas problème pour être écrite dans un autre fichier, et en plus elle se permet le culot d'être copiée sans perdre les parenthèses, cette fois-ci !

    ô_ô

  15. #15
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    Le problème n'est pas avec ses codes (qui marchent tous bien):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    ##############################################################
    
    type NUL>%fichier2%
    for /F "tokens=* delims=" %%i in ('type %fichier1%') do (
      echo %%i>>%fichier2%
    )
    
    ##############################################################
    
    findstr /vir "^$" infile >outfile
    
    #############################################################
    
    <infile sed -n "/./p" >outfile
    
    #############################################################
    
    <infile sed "/^$/d" >outfile
    
    ##############################################################
    mais ton code.


    essayes de ne pas activer l'ERV en créant des pseudo-sous-fonctions, et utilises les variables de substitutions (voir SET/?)

    voici un petit exemple:

    But du code: lister les noms de fichiers se trouvant dans inFILE.txt "ET QUI CONTIENNET DES CARACTERES RESERVES" tout en vérifiant leurs présence. et va créer un fichier outFILE.txt qui contiendra les fichiers présents et les fichiers manquants


    contenu de inFILE.txt
    =====================
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    C:\JOUER1 & s'amuser !.lnk
    C:\JOUER2 !.lnk
    C:\JOUER3 & s'amuser !.lnk
    C:\JOUER4 % s'amuser !.lnk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @echo off 
    for /f "delims=" %%a in (inFILE.txt) do set "VAR=%%a" & call:parseLine>>outFILE.txt
    pause&goto:EOF
    :parseLine
    set "VAR=%VAR:&=^&%"
    if exist "%VAR%" (echo PRESENT %VAR%) else (echo MANQUANT %VAR%)
    goto:eof

    contenu de outFILE.txt
    =======================
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MANQUANT C:\JOUER1 & s'amuser !.lnk
    PRESENT C:\JOUER2 !.lnk
    MANQUANT C:\JOUER3 & s'amuser !.lnk
    MANQUANT C:\JOUER4 % s'amuser !.lnk

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    -supression de mon message -

    Moi ça m'hallucine. Dans ton dernier exemple, on voit bien que "VAR" est crée dans la boucle, mais comme par magie t'as pas besoin d'activer l'ERV pour la réutiliser plus loin dans la procédure externe.

    Chapeau, celle-là elle m'épate !

    Quand je pense à tout le mal que j'ai eu à comprendre qu'il me fallait activer l'ERV pour faire fonctionner les variables crée dans des boucle hors de celle-ci, voilà maintenant que ça sert plus à rien !

    Je vais devenir barge à force.

    Puis tu me dis de pas faire des "pseudo-sous-fonctions", mais t'en fais une rien que pour tester "if exist "%VAR%", donc...
    Je vois mal comment je vais pouvoir me passer de l'ERV dans mon batch.

    Sérieusement je vois mal comment je vais m'en sortir avec ton exemple, qui fonctionne soit dit en passant, mais qui m'apparaît complètement mystérieux.

    A la limite faudrait reprendre ligne par ligne le code que je met à disposition sur ce topic, en me montrant une autre façon de procéder : http://www.developpez.net/forums/d82...s/#post4727371

    J'vois mal comment faire autrement

    Concernant cette ligne, elle est sensée changer les "&" en "^&"? Pourquoi ne pas agir sur les "%" et les "!"?


    edit : c'est quand même bizarre, t'es le seul type à connaître le MS-DOS sur ce forum ou quoi? ^^

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 67
    Points
    67
    Par défaut
    Bon c'est réglé. J'étais un peu fatigué d'me crouter comme un noob, excuse pour les pleurnicheries !

    J'ai copié ton code à la fin, après avoir endlocal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    :2_end
    echo %totalfiles%>"%#temp1%"
    echo %totalsize%>"%#temp2%"
    endlocal
    echo ON SUPPRIME LES LIGNES VIDES DANS "PROBLEMS.TXT"
    for /f "usebackq delims=" %%a in ("%#problems%") do set "VAR=%%a" & call:parseLine>>"%#problems2%"
    exit
    :parseLine
    set "VAR=%VAR:&=^&%"
    echo %VAR%
    goto :eof
    IM_HERE, mon héros !

  18. #18
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    Salut,

    content que t'as pu résoudre ton problème tout seul

    Citation Envoyé par DeVit Voir le message

    edit : c'est quand même bizarre, t'es le seul type à connaître le MS-DOS sur ce forum ou quoi? ^^
    non, il y en a beaucoup mais malheureusement ils sont un peu timides..sauf quelques-uns..

    EDIT: pour les caractères "(" et ")" tu peux mettre ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set "VAR=%VAR:)=^)%"
    set "VAR=%VAR:(=^(%"

  19. #19
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Salut;

    Citation Envoyé par I'm_HERE Voir le message
    content que t'as pu résoudre ton problème tout seul
    D'après ce que j'en ai lu et les quelques scripts qui s'y réfèrent, je peux dire que le problème n'est pas résolu, et pourtant DeVit s'est résolu à mettre la discussion en résolu... Ma foi.

    Sinon en ce qui concerne sed, c'est la version GNU sed 3.02.80 qu'il faut, la dernière bêta datant de 2003 il me semble. Ou bien GNU sed version 4.2 de juin 2009.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. remplacer une ligne contenant / avec la commande sed
    Par GoldenEyes dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 11/09/2009, 18h38
  2. Supprimer les lignes vides avec Notepad++
    Par Monstros Velu dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 25/04/2009, 01h16
  3. Gestion des lignes vides avant/après une liste
    Par 84mickael dans le forum Mise en forme
    Réponses: 4
    Dernier message: 28/08/2007, 16h25
  4. Afficher les lignes désirées avec la commande awk
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 16/06/2007, 20h58
  5. Problème avec la commande sed
    Par JUSTIN Loïc dans le forum Linux
    Réponses: 2
    Dernier message: 05/09/2006, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo