Rechercher : dans
Par :

Shell, tester une ligne dans une boucle IF

Dernière réponse le 24 mar 2008 à 18:45:46 Albator, le 22 fév 2008 à 12:23:02 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Shell, tester une ligne dans une boucle IF » dans :
[Shell] Tester une variable numérique VoirTester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Le remplacement de variables en shell Bash Voir=Le remplacement de variables= Introduction Il peut s'avérer utile de s'assurer qu'une variable est bien définie avant de procéder à son remplacement, ou tout simplement de s'assurer que celle-ci n'est pas vide, et dans ce cas de l'initialiser avec...
PHP - Structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (le PHP associe le mot clé true à 1...
VBScript - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (VBScript associe le mot clé true à...
Perl - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditonnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...

1

Darkito, le 22 fév 2008 à 12:40:12

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.
Tøƒ
A quand la matière "Comment faire une recherche Google ?" obligatoire dès la 6ème ?

Répondre à Darkito

2

Albator, le 22 fév 2008 à 12:58:43

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=cna­mts,dc=fr
changetype: modifynreplace: anruidnanruid: 0501341507012700014
site: 0000141507012700014

Répondre à Albator

3

Darkito, le 22 fév 2008 à 13:15:03

Il 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à... Tøƒ
A quand la matière "Comment faire une recherche Google ?" obligatoire dès la 6ème ?

Répondre à Darkito

4

Albator, le 22 fév 2008 à 13:28:21

Non, le -e n'y change rien
mais la commande SED est une très bonne piste
merci encore

Répondre à Albator

5

Darkito, le 22 fév 2008 à 13:31:22

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. Tøƒ
A quand la matière "Comment faire une recherche Google ?" obligatoire dès la 6ème ?

Répondre à Darkito

6

jipicy, le 22 fév 2008 à 13:37:38
  • +1

Salut,

sed '/anruid/ i\changetype: modify\nreplace: anruid'
;-))

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

7

Albator, le 22 fév 2008 à 14:00:17

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 !!!

Répondre à Albator

8

Darkito, le 22 fév 2008 à 14:06:14

Il 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

Tøƒ
A quand la matière "Comment faire une recherche Google ?" obligatoire dès la 6ème ?

Répondre à Darkito

9

Albator, le 22 fév 2008 à 14:10:32

Je les ai ajouté car sans, la commande me retourne :
sed: command garbled: anruid/ i\changetype: modify\nreplace: anruid

moi pas comprendre :(

Répondre à Albator

11

jipicy, le 22 fév 2008 à 15:53:59

je 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
;-))

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

10

Albator, le 22 fév 2008 à 15:03:04

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

Répondre à Albator

12

bobtipitt, le 24 mar 2008 à 17:14:00

Moi je dis que ce code est faux
il y a surement
une autre
manière de
le faire plus
simplement Etienne l-L

Répondre à bobtipitt

13

jipicy, le 24 mar 2008 à 17:24:47

Dans ce cas on attend d'être éclairé par tes lumières...

Merci d'avance ;-)
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.

Répondre à jipicy

14

bobtipitt, le 24 mar 2008 à 18:31:41

Lol mais je sais que si sa marche c le bon Etienne l-L

Répondre à bobtipitt

15

 jipicy, le 24 mar 2008 à 18:45:46

On attend toujours !!!
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.

Répondre à jipicy
Collection CommentÇaMarche.net