Chaîne de caractères avec sed ou autre

ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -  
ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

je dois faire quelque traitement sur un fichier ldif pour récupérer les informations sur un AD.

En exécutant ma commande ldifde pour importer mes objets, j'ai une erreur de syntaxe......

En regardant un peu,

j'ai une ligne avec

proxyAddresses:
x400:C=toto:A=tata:P=coucou..........

pour que la commande ldifde fonctionne, la ligne doit être la suivante

proxyAddresses: x400:C=toto:A=tata:P=coucou..........

c'est un vrai problème car le fichier comporte 2000 objets à importer.Je ne peux pas le faire manuellement

Avez-vous une idée pour réaliser ce genre de traitement c'est à dire fusionner les deux lignes pour obtenir qu'une seule ligne avec un espace entre proxyAddresses: et x400:C=toto:A=tata:P=coucou..........

pour obtenir

proxyAddresses: x400:C=toto:A=tata:P=coucou..........

je précise que le traitement ne doit se faire que sur les lignes

proxyAddresses: x400.........

j'ai essayé avec la commande sed mais je n'y arrive pas. Avez-vous une autre idée s'il vous plaît pour réaliser ce genre de traitement.

Merci par avance.

21 réponses

  • 1
  • 2
Résumé de la discussion

Le problème porte sur la fusion automatique des lignes proxyAddresses dans un fichier LDIF destiné à ldifde, afin d'obtenir une seule ligne proxyAddresses: x400:… et d'éviter une erreur de syntaxe lors de l'import. Des réponses suggèrent de fusionner les lignes x400 et x500, et d'envisager que les lignes suivantes commencent par xnnn, tout en testant l'usage de sed et en s'interrogeant sur la casse. La discussion évoque aussi des variantes comme l'ajout d'espaces en début de ligne ou l'insertion de lignes vides pour séparer les blocs LDIF, et des ambiguïtés autour de proxyAddresses et textEncodedORAddress.

Bobot (l'IA à votre service)
  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    Salut,

    je précise que le traitement ne doit se faire que sur les lignes
    proxyAddresses: x400........

    Pourquoi, il y a des lignes qui diffèrent ? A quel niveau (x400) ?
    0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    J'anticipe...

    $ cat plop 
    proxyAddresses:
    x400:C=toto:A=tata:P=coucou..........
    proxyAddresses:
    x500:C=toto:A=tata:P=coucou..........
    
    $ sed '/^proxyAddresses:/{N;/\nx400/{s/\n/ /}}' plop 
    proxyAddresses: x400:C=toto:A=tata:P=coucou..........
    proxyAddresses:
    x500:C=toto:A=tata:P=coucou..........
    
    $

    0
  3. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    merci

    oui j'ai des lignes qui diffèrent. J'ai donné x400 pour exemple, j'ai regardé dans mon fichier, j'ai le même soucis avec le x500 en début de ligne aussi

    Si je veux faire un traitement en masse c'est à dire x400 et x500 et autre, est ce que la commande sed fera l'affaire ?
    C'est quoi la syntaxe si je suis avec l'éditeur vim

    j'ai l'habitude de faire

    :1;$ sed/.............................//g

    Merci pour ton aide
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      oui j'ai des lignes qui diffèrent. J'ai donné x400 pour exemple, j'ai regardé dans mon fichier, j'ai le même soucis avec le x500 en début de ligne aussi

      Le problème est de savoir si il faut traiter toutes les lignes commençant par "proxyAddresses:" d'une part et ensuite si toutes les lignes qui suivent doivent être ajoutées et le cas échéant s'il faut s'assurer que la ligne à remonter doit commencer par "xnnn" sans tenir compte des "nnn" ???

      Avec vim je ne sais pas, mais avec "sed" oui, d'autant qu'il est vraiment fait pour ce genre de traitement.
      0
  4. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    oui effectivement, c'est bien ça:

    il faut traiter toutes les lignes commençant par "proxyAddresses:" et la ligne suivante à remonter commence par x500 ou x400.

    désolé, chui vraiment pas une bête avec ce genre de traitement.

    Merci
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    J'ai essayé la commande comme ceci:

    sed -i '/^proxyAddresses:/{N;/\nx400/{s/\n/ /}}' monfichier.ldf

    la commande traite quelques lignes car j'ai encore des lignes qui commence par sous la forme:
    proxAddresses:
    x400:.............................

    pourquoi la commande ne traite que quelques lignes et pas toutes les lignes ?

    c pas évident
    0
  7. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    sinon est ce que tu peux si je raisonne comme ceci:

    toutes les lignes commençant par x400 ou x500, je le la fusionne avec la ligne précédente pour obtenir le même résultat comme ceci

    proxyAddresses: x400:C=toto:A=tata:P=coucou
    0
  8. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    Fais une copie de ton fichier, puis lance cette commande :

     sed -i '/^proxyAddresses:/{N;/\nx[45]00/{s/\n/ /}}' fichier


    Voila ce que ça devrait faire :

    $ cat plop 
    proxyAddresses:
    x400:C=toto:A=tata:P=coucou..........
    proxyAddresses:
    x500:C=toto:A=tata:P=coucou..........
    proxyAddresses:
    x600:C=toto:A=tata:P=coucou..........
    proxyAddresses:
    x500:C=toto:A=tata:P=coucou..........
    
    $ sed -i '/^proxyAddresses:/{N;/\nx[45]00/{s/\n/ /}}' plop 
    
    $ cat plop 
    proxyAddresses: x400:C=toto:A=tata:P=coucou..........
    proxyAddresses: x500:C=toto:A=tata:P=coucou..........
    proxyAddresses:
    x600:C=toto:A=tata:P=coucou..........
    proxyAddresses: x500:C=toto:A=tata:P=coucou..........
    
    $

    0
  9. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    en exécutant sed -i '/^proxyAddresses:/{N;/\nx[45]00/{s/\n/ /}}' fichier

    je me retrouve toujours avec quelques lignes non traitées.

    As-tu la solution si je raisonne avec toutes les lignes commençant par x400 ou x500
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      je me retrouve toujours avec quelques lignes non traitées.
      Euh... sans voir les lignes en elle-même afin d'identifier la cause, difficile de se faire une idée du pourquoi ;-(
      0
  10. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    oui je comprends,

    demain je t'en verrai ca.

    sinon peux tu me donner la syntaxe avec la commande sed pour ajouter un espace pour toutes les lignes qui comment par x500 ou x400 s'il te plaît ?

    Je te remercie par avance
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Pour ajouter un espace où ?
      0
  11. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    ah désolé, ajouter un espace en début de ligne

    >x400

    résultat
    > x400

    c'est possible ?
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Oui.

      Par contre le chevron (>) fait partie de la ligne ?
      0
  12. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    nan nan le chevon ne fait pas partie de ligne,

    j'aurai du symboliser l'environnement linux comme ceci $

    $x400
    $ x400
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      $ echo -e "${A}" 
      x400 blabla
      x500 bli bli
      x600 bloblo
      
      $ echo -e "${A}" | sed '/^x[45]00/{s/^/ /}'
       x400 blabla
       x500 bli bli
      x600 bloblo
      
      $
      0
  13. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    merci beaucoup,

    demain je vais essayer ta commande et je te dirais si c'est ok.

    Bonne soirée
    0
  14. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    j'ai essayé la commande est le résultat est correct, merci beaucoup.

    J'aurai une question à te poser, toujours avec sed, est ce qu'il est possible de rajouter une une ligne vide entre deux blocs, je m'explique
    voici la structure de mon fichier ldif

    dn: CN=........................
    changetype: add
    objetclass:................................
    blabla
    blabla
    blabla
    mail= toto@tata.fr
    dn: CN=........................
    changetype: add
    objetclass:................................
    blabla
    blabla
    blabla
    mail=essai@comment.com

    je voudrais rajouter une ligne vide juste après l'attribut mail pour séparer le premier bloc et le second bloc et ainsi de suite pour obtenir le résultat suivant

    dn: CN=........................
    changetype: add
    objetclass:................................
    blabla
    blabla
    blabla
    mail= toto@tata.fr

    dn: CN=........................
    changetype: add
    objetclass:................................
    blabla
    blabla
    blabla
    mail=essai@comment.com

    merci par avance pour ton aide
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      sed 's/^mail=.*/&\n/' fichier
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      En y repensant, y'a plus simple :

      sed '/^mail=/{G}' fichier
      ;-))
      0
  15. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    salut,

    j'ai essayé les deux commandes que tu m'as donné

    sed 's/^mail=.*/&\n/' fichier

    sed '/^mail=/{G}' fichier

    et dans mon fichier, je n'ai pas de changement, il n'y pas de ligne vide entre les deux blocs.

    le soucis vient d'où?
    0
  16. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    fausse alerte, ça marche très bien, j'avais mis un mail= au lieu de mail:

    Merci pour ton aide
    0
  17. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    toujours dans la même idée

    peux tu me dire comment supprimer dans ce même fichier avec sed

    toutes les lignes commençant par textEncodedORAAddres:

    Merci pour ton aide
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      sed '/^textEncodedORAAddres:/d' fichier
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Et avant les prochaines questions : FAQ - SED ;-))
      0
    3. Swiss Knight Messages postés 2257 Statut Membre 110
       
      Salut, sais-tu s'il existe le même genre de pages pour awk ?
      0
  18. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    ok pas de soucis.

    Merci beaucoup pour toutes ces réponses rapides et efficaces.

    Bonne soirée
    0
  19. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    Là j'ai cherché sur le FAQ et je n'ai pas trouvé la réponse.

    Je me posais la question comment ajouter une ligne vide juste avant la chaîne de caractère trouvée.
    je voudrais ajouter une ligne vide pour séparer les deux blocs mais en raisonnant différemment car j'ai constaté qu'en traitant mon fichier ldif, les deux blocs ne sont pas séparés car certain bloc ne se termine pas par mail=toto@tata.fr et donc sed ne réalise pas l'opération car ca ne match pas.
    Donc je raisonne dans l'autre sens c'est à dire toute chaîne commençant par
    dn: CN=, ajouter une ligne vide au dessus pour donner ce résultat :

    dn: CN=........................
    changetype: add
    objetclass:................................
    blabla
    blabla
    blabla
    mail= toto@tata.fr

    dn: CN=........................
    changetype: add
    objetclass:................................
    blabla
    blabla
    blabla
    GivenName: allo allo allo

    dn: CN=........................
    changetype: add
    objetclass:................................
    blabla
    blabla
    blabla
    GivenName: allo allo allo
    mail=essai@comment.com

    ;) vi

    début de commande

    sed 's/^dn:.*//' comment dire ajouter une vide au dessus ?

    Crois-tu que c'est faisable ?
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      sed '/^dn:.*/{s//\n&/}' fich 
      0
  20. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,

    merci pour votre réponse ça marche très bien.

    j'ai du mal à faire fusionner toutes chaines commençant par
    "x400:" ou "x500" la ligne précédente.

    proxyAddresses:
    x500:C=toto:A=tata:P=coucou..........
    proxyAddresses:
    x400:C=toto:A=tata:P=coucou..........
    proxyAddresses:
    X500:C=toto:A=tata:P=coucou........

    pour obtenir ceci

    proxyAddresses: x400:C=toto:A=tata:P=coucou..........
    proxyAddresses: X500:C=toto:A=tata:P=coucou..........
    textORAENCODED: x500:C=toto:A=tata:P=coucou..........
    .................................................................

    sed -i '/^[xX][45]00:/ ;)...............': comment lui dire fusionne à la ligne précédente

    Je commence à prendre goût à la manipulation des chaines de caractères, on voit bien la puissance sous Linux/Unix.

    Je te remercie par avance
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      j'ai du mal à faire fusionner toutes chaines commençant par "x400:" ou "x500" la ligne précédente.

      Hein ? ;-((
      0
  21. ced66666 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
     
    désolé, j'ai écris trop vite:

    j'ai du mal à fusionner toutes chaines commençant par
    "x400:" ou "x500" à la ligne précédente. (faire remonter à la ligne du dessus).
    Comme ceci:

    proxyAddresses:
    x500:C=toto:A=tata:P=coucou..........
    proxyAddresses:
    x400:C=toto:A=tata:P=coucou..........
    proxyAddresses:
    X500:C=toto:A=tata:P=coucou........

    pour obtenir ceci

    proxyAddresses: x400:C=toto:A=tata:P=coucou..........
    proxyAddresses: X500:C=toto:A=tata:P=coucou..........
    textORAENCODED: x500:C=toto:A=tata:P=coucou..........
    .................................................................

    Merci par avance
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      textORAENCODED:
      D'où il sort lui ???

      sed 'N;/\nx[45]00/{s/\n/ /}' fichier 
      0
  • 1
  • 2