Unix sed

Résolu
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. 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
    1. Contributeur
      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
      1. 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. Contributeur
          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. Contributeur
          /^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. 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. C'est bon j'ai réglé le problème.

          Merci pour toute ton aide.
          0