Unix sed

Résolu
remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   -  
remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Voilà mon problème j'ai un fichier de ce type:

dn: uid=toto,cn=toto,c=fr
objectclass: top

dn: uid=tata,cn=tata,c=fr
objectclass: top

dn: uid=titi,cn=titi,c=fr
objectclass: top

J'aimerai ajouter une ligne à ce fichier de sorte qu'il soit ainsi:

dn: uid=toto,cn=toto,c=fr
objectclass: top
ref: uid=toto,cn=toto,c=fr

dn: uid=tata,cn=tata,c=fr
objectclass: top
ref: uid=tata,cn=tata,c=fr

dn: uid=titi,cn=titi,c=fr
objectclass: top
dn: uid=titi,cn=titi,c=fr

Pour le moment en utilisant sed j'obtiens ceci:

dn: uid=toto,cn=toto,c=fr
objectclass: top
ref: uid=toto,cn=toto,c=fr
ref: uid=tata,cn=tata,c=fr
dn: uid=titi,cn=titi,c=fr

dn: uid=tata,cn=tata,c=fr
objectclass: top
ref: uid=tata,cn=tata,c=fr
ref: uid=toto,cn=toto,c=fr
dn: uid=titi,cn=titi,c=fr

dn: uid=titi,cn=titi,c=fr
objectclass: top
dn: uid=titi,cn=titi,c=fr
ref: uid=tata,cn=tata,c=fr
ref: uid=toto,cn=toto,c=fr

Je ne vois pas comment faire pour avoir le résultat attendu.

Par avance merci.

3 réponses

  1. remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   6
     
    voilà à quoi ressemble mon code pour le moment:

    perl -0777 -ne 'print "$1\n" while/dn: (.*?)\nobjectClass/gs' $LDIF_USERS > $SEARCH_USERS
    
    TEMP=temp.tmp
    while read ligne
            do
            set $(echo $ligne)
            user=$(eval echo $1)
            perl -0777 -ne 'print "$1\n" while/dn: (.*?)\nobjectClass/gs' $LDIF_USERS > $TEMP
            while read ligne
            do
            set $(echo $ligne)
            user2=$(eval echo$1)
            if [ $user = $user2 ]
            then
                    sed -i '/sn: */aref: '$URL_GARDIAN'/'$user'' $LDIF_USERS
            fi
            done < $LDIF_USERS
    done < $SEARCH_USERS
    0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Un truc comme ça :

    $ cat plop 
    dn: uid=toto,cn=toto,c=fr
    objectclass: top
    
    dn: uid=tata,cn=tata,c=fr
    objectclass: top
    
    dn: uid=titi,cn=titi,c=fr
    objectclass: top
    
    $ sed '/^dn/{h;N;x;s/dn:/ref:/;H;g}' plop 
    dn: uid=toto,cn=toto,c=fr
    objectclass: top
    ref: uid=toto,cn=toto,c=fr
    
    dn: uid=tata,cn=tata,c=fr
    objectclass: top
    ref: uid=tata,cn=tata,c=fr
    
    dn: uid=titi,cn=titi,c=fr
    objectclass: top
    ref: uid=titi,cn=titi,c=fr
    
    $

    ;-))
    0
  3. remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   6
     
    Parfait ça fonctionne très bien (même si je n'ai pas tout saisi à la commande)

    Du coup si je veux avoir
    ref: http://test.html/uid=titi,cn=titi,c=fr</code> il me suffis de passer la commande suivante:
    

    sed '/^dn/{h;N;x;s/dn:/ref: '$URL'/;H;g}'
    ???</pre>
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Euh... non, pas tout a fait ;-(

      Comme ta variable contient des slashs, il faut changer le délimiteur de la commande "s" (substitution) de sed (dans l'exemple ci-dessous, j'ai utilisé des dièses (#) à la palce des slashs (/) :

      $ URL="http://test.html/"

      $ sed '/^dn/{h;N;x;s#dn: #ref:'"${URL}"'#;H;g}' plop
      dn: uid=toto,cn=toto,c=fr
      objectclass: top
      ref:http://test.html/uid=toto,cn=toto,c=fr

      dn: uid=tata,cn=tata,c=fr
      objectclass: top
      ref:http://test.html/uid=tata,cn=tata,c=fr

      dn: uid=titi,cn=titi,c=fr
      objectclass: top
      ref:http://test.html/uid=titi,cn=titi,c=fr

      $
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      /^dn/
      Quand une ligne commence (^) par "dn"

      {
      Début groupement de commandes

      h
      On copie la ligne dans la mémoire secondaire en écrasant son éventuel contenu.
      La mémoire principale contenant toujours la ligne commençant par "dn"

      N
      On ajoute la ligne suivante.

      x
      On échange le contenu des 2 mémoires (la principale et la secondaire)

      s/dn:/ref:/
      On substitue le motif

      H
      On ajoute le changement à la suite du contenu de la mémoire secondaire (qui contient toujours les 2 lignes)

      g
      On écrase le contenu de la mémoire principale par le contenu de la mémoire secondaire

      }
      Fin du regroupement de commandes
      0
    3. remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   6
       
      Lorsque j'utilise ta commande j'obtiens ceci:

      ref:http://test.html/[ESPACE]uid=titi,cn=titi,c=fr

      Comment y remédier ?
      0
    4. remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   6
       
      C'est bon j'ai réglé le problème.

      Merci pour toute ton aide.
      0