Unix sed

Résolu/Fermé
remousse Messages postés 299 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 20 novembre 2014 - 30 sept. 2011 à 15:36
remousse Messages postés 299 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 20 novembre 2014 - 30 sept. 2011 à 16:36
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

remousse Messages postés 299 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 20 novembre 2014 6
30 sept. 2011 à 15:45
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
30 sept. 2011 à 15:45
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
remousse Messages postés 299 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 20 novembre 2014 6
30 sept. 2011 à 15:56
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}'
???
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
Modifié par zipe31 le 30/09/2011 à 16:11
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
30 sept. 2011 à 16:20
/^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
remousse Messages postés 299 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 20 novembre 2014 6
30 sept. 2011 à 16:31
Lorsque j'utilise ta commande j'obtiens ceci:

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

Comment y remédier ?
0
remousse Messages postés 299 Date d'inscription dimanche 2 novembre 2008 Statut Membre Dernière intervention 20 novembre 2014 6
30 sept. 2011 à 16:36
C'est bon j'ai réglé le problème.

Merci pour toute ton aide.
0