Shell, tester une ligne dans une boucle IF

Résolu
Bonjour,

Je souhaiterais, dans un script Shell, lire un fichier ligne par ligne
vérifier, pour chaque ligne, si elle commence par une chaîne
si c'est le cas modifier la ligne sinon afficher la ligne...
mais je n'arrive pas à tester le début de chaque ligne

voici ce que j'ai fait :

#! /bin/bash
cat /tmp/ATM-C2I.ldif|while read ligne
do
if [ $ligne = `grep ^anruid` ]
then
echo -e "changetype: modify\nreplace: anruid\n$ligne\n"
else
echo $ligne
fi
done
******************************
contenu du fichier /tmp/ATM-C2I.ldif

dn: uid=TRIBOULET,ou=utilisateurs,o=urcam,dc=cnamts,dc=fr
anruid: 0501341507012700014
site: 0000141507012700014

dn: uid=LHOTE,ou=utilisateurs,o=urcam,dc=cnamts,dc=fr
anruid: 0502041507012700014
site: 0000141507012700014

et le résultat que je souhaiterais obtenir :

dn: uid=TRIBOULET,ou=utilisateurs,o=urcam,dc=cnamts,dc=fr
changetype: modify
replace: anruid
anruid: 0501341507012700014
site: 0000141507012700014

dn: uid=LHOTE,ou=utilisateurs,o=urcam,dc=cnamts,dc=fr
changetype: modify
replace: anruid
anruid: 0502041507012700014
site: 0000141507012700014

Par avance, merci

6 réponses

  1. Modérateur
    Salut,
    sed '/anruid/ i\changetype: modify\nreplace: anruid'
    ;-))
    1
    1. je ne sais pas si c'est un problème de version de SED... je suis sous SUN 5.9
      mais j'obtiens ceci :

      # sed 's/anruid/ i\changetype: modify\nreplace: anruid/g' ATM-C2I.ldif

      dn: uid=TRIBOULET,ou=utilisateurs,o=urcam,dc=cnamts,dc=fr
      ichangetype: modifynreplace: anruid: 0501341507012700014
      site: 0000141507012700014

      je n'ai pas (encore) trouvé l'option de SED qui permettrait d'interpréter les \n
      grrr !!!
      0
    2. @AlbatorIl n'y a pas de s au début et de g à la fin

      /anruid/ signifie qu'on cherche le motif anruid au début
      ensuite i\ insère la ligne avant.

      Mais je pense que tu as quand même le problème de \n

      0
    3. @Darkitoje les ai ajouté car sans, la commande me retourne :
      sed: command garbled: anruid/ i\changetype: modify\nreplace: anruid

      moi pas comprendre :(
      0
    4. Modérateur
      @Albatorje n'ai pas (encore) trouvé l'option de SED qui permettrait d'interpréter les \n

      Dans ce cas là, écrit ta syntaxe sur plusieurs lignes :
      sed '/anruid/ i\changetype: modify\
      replace: anruid
      ' fichier
      ;-))
      0
  2. Bonjour, c'est réalisable directement via la fonction sed

    Darkito >cat totof
    dn: uid=TRIBOULET,ou=utilisateurs,o=urcam,dc=cnamts,dc=fr
    anruid: 0501341507012700014
    site: 0000141507012700014
    
    dn: uid=LHOTE,ou=utilisateurs,o=urcam,dc=cnamts,anruiddc=fr
    anruid: 0502041507012700014
    site: 0000141507012700014 
    Darkito >sed 's@^anruid@changetype: modify\nreplace: anruid\nanruid@g' totof
    dn: uid=TRIBOULET,ou=utilisateurs,o=urcam,dc=cnamts,dc=fr
    changetype: modify
    replace: anruid
    anruid: 0501341507012700014
    site: 0000141507012700014
    
    dn: uid=LHOTE,ou=utilisateurs,o=urcam,dc=cnamts,anruiddc=fr
    changetype: modify
    replace: anruid
    anruid: 0502041507012700014
    site: 0000141507012700014 
    


    J'ai ajouté un "anruid" dans le fichier test pour vérifier que ça ne prenait que les débuts de ligne.
    0
    1. Merci,

      Par contre chez moi, je n'obtiens pas le même résultat que toi

      dn: uid=TRIBOULET-05013,ou=utilisateurs,o=urcam-bourgogne,dc=cnamts,dc=fr
      changetype: modifynreplace: anruidnanruid: 0501341507012700014
      site: 0000141507012700014
      0
    2. @AlbatorIl y a un problème avec les \n ....
      J'ai pas un 'sed' classique au boulot...
      essaie en ajoutant "-e"
      sed -e 's@^anruid@changetype: modify\nreplace: anruid\nanruid@g'

      je ne sais pas du tout si ça vient de là...
      0
  3. non, le -e n'y change rien
    mais la commande SED est une très bonne piste
    merci encore
    0
    1. C'est clair que sed est très (très) utile.
      Il y a Jipicy qui est sur CCM et qui connait très bien cette fonction.
      Je vais essayer de voir avec lui d'où viens le problème.
      0
  4. Problème Résolu

    Je n'ai pas trouvé de solution avec SED, je suis donc revenu à mon idée initiale
    voici mon contournement :

    while read ligne
    do
    echo $ligne|grep ^anruid >/dev/null
    if [ $? -eq 0 ]
    then
    echo -e "changetype: modify\nreplace: anruid\n$ligne"
    else
    echo $ligne
    fi
    done</tmp/ATM-C2I.ldif

    merci francky pour ta solution
    0
    1. Moi je dis que ce code est faux
      il y a surement
      une autre
      manière de
      le faire plus
      simplement
      0
      1. Modérateur
        Dans ce cas on attend d'être éclairé par tes lumières...

        Merci d'avance ;-)
        0
    2. Lol mais je sais que si sa marche c le bon
      0
      1. Modérateur
        On attend toujours !!!
        0