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
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
-
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.
-
-
@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à...
-
-
non, le -e n'y change rien
mais la commande SED est une très bonne piste
merci encore -
ModérateurSalut,
sed '/anruid/ i\changetype: modify\nreplace: anruid'
;-))
-
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 !!! -
@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
-
@Darkitoje les ai ajouté car sans, la commande me retourne :
sed: command garbled: anruid/ i\changetype: modify\nreplace: anruid
moi pas comprendre :( -
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
;-))
-
-
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 -
Moi je dis que ce code est faux
il y a surement
une autre
manière de
le faire plus
simplement -
Lol mais je sais que si sa marche c le bon