Chaîne de caractères avec sed ou autre

Fermé
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012 - 10 déc. 2012 à 16:57
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012 - 13 déc. 2012 à 20:31
Bonjour,

je dois faire quelque traitement sur un fichier ldif pour récupérer les informations sur un AD.

En exécutant ma commande ldifde pour importer mes objets, j'ai une erreur de syntaxe......

En regardant un peu,

j'ai une ligne avec

proxyAddresses:
x400:C=toto:A=tata:P=coucou..........

pour que la commande ldifde fonctionne, la ligne doit être la suivante

proxyAddresses: x400:C=toto:A=tata:P=coucou..........

c'est un vrai problème car le fichier comporte 2000 objets à importer.Je ne peux pas le faire manuellement

Avez-vous une idée pour réaliser ce genre de traitement c'est à dire fusionner les deux lignes pour obtenir qu'une seule ligne avec un espace entre proxyAddresses: et x400:C=toto:A=tata:P=coucou..........

pour obtenir

proxyAddresses: x400:C=toto:A=tata:P=coucou..........

je précise que le traitement ne doit se faire que sur les lignes

proxyAddresses: x400.........

j'ai essayé avec la commande sed mais je n'y arrive pas. Avez-vous une autre idée s'il vous plaît pour réaliser ce genre de traitement.

Merci par avance.
A voir également:

21 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 déc. 2012 à 17:04
Salut,

je précise que le traitement ne doit se faire que sur les lignes
proxyAddresses: x400........

Pourquoi, il y a des lignes qui diffèrent ? A quel niveau (x400) ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 déc. 2012 à 17:15
J'anticipe...

$ cat plop 
proxyAddresses:
x400:C=toto:A=tata:P=coucou..........
proxyAddresses:
x500:C=toto:A=tata:P=coucou..........

$ sed '/^proxyAddresses:/{N;/\nx400/{s/\n/ /}}' plop 
proxyAddresses: x400:C=toto:A=tata:P=coucou..........
proxyAddresses:
x500:C=toto:A=tata:P=coucou..........

$

0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
10 déc. 2012 à 19:26
merci

oui j'ai des lignes qui diffèrent. J'ai donné x400 pour exemple, j'ai regardé dans mon fichier, j'ai le même soucis avec le x500 en début de ligne aussi



Si je veux faire un traitement en masse c'est à dire x400 et x500 et autre, est ce que la commande sed fera l'affaire ?
C'est quoi la syntaxe si je suis avec l'éditeur vim

j'ai l'habitude de faire

:1;$ sed/.............................//g


Merci pour ton aide
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 déc. 2012 à 19:33
oui j'ai des lignes qui diffèrent. J'ai donné x400 pour exemple, j'ai regardé dans mon fichier, j'ai le même soucis avec le x500 en début de ligne aussi

Le problème est de savoir si il faut traiter toutes les lignes commençant par "proxyAddresses:" d'une part et ensuite si toutes les lignes qui suivent doivent être ajoutées et le cas échéant s'il faut s'assurer que la ligne à remonter doit commencer par "xnnn" sans tenir compte des "nnn" ???

Avec vim je ne sais pas, mais avec "sed" oui, d'autant qu'il est vraiment fait pour ce genre de traitement.
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
Modifié par ced66666 le 10/12/2012 à 20:20
oui effectivement, c'est bien ça:

il faut traiter toutes les lignes commençant par "proxyAddresses:" et la ligne suivante à remonter commence par x500 ou x400.

désolé, chui vraiment pas une bête avec ce genre de traitement.

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
10 déc. 2012 à 22:06
J'ai essayé la commande comme ceci:

sed -i '/^proxyAddresses:/{N;/\nx400/{s/\n/ /}}' monfichier.ldf

la commande traite quelques lignes car j'ai encore des lignes qui commence par sous la forme:
proxAddresses:
x400:.............................

pourquoi la commande ne traite que quelques lignes et pas toutes les lignes ?

c pas évident
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
10 déc. 2012 à 22:18
sinon est ce que tu peux si je raisonne comme ceci:

toutes les lignes commençant par x400 ou x500, je le la fusionne avec la ligne précédente pour obtenir le même résultat comme ceci

proxyAddresses: x400:C=toto:A=tata:P=coucou
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 déc. 2012 à 22:25
Fais une copie de ton fichier, puis lance cette commande :

 sed -i '/^proxyAddresses:/{N;/\nx[45]00/{s/\n/ /}}' fichier


Voila ce que ça devrait faire :

$ cat plop 
proxyAddresses:
x400:C=toto:A=tata:P=coucou..........
proxyAddresses:
x500:C=toto:A=tata:P=coucou..........
proxyAddresses:
x600:C=toto:A=tata:P=coucou..........
proxyAddresses:
x500:C=toto:A=tata:P=coucou..........

$ sed -i '/^proxyAddresses:/{N;/\nx[45]00/{s/\n/ /}}' plop 

$ cat plop 
proxyAddresses: x400:C=toto:A=tata:P=coucou..........
proxyAddresses: x500:C=toto:A=tata:P=coucou..........
proxyAddresses:
x600:C=toto:A=tata:P=coucou..........
proxyAddresses: x500:C=toto:A=tata:P=coucou..........

$

0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
10 déc. 2012 à 22:34
en exécutant sed -i '/^proxyAddresses:/{N;/\nx[45]00/{s/\n/ /}}' fichier

je me retrouve toujours avec quelques lignes non traitées.

As-tu la solution si je raisonne avec toutes les lignes commençant par x400 ou x500
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 déc. 2012 à 22:37
je me retrouve toujours avec quelques lignes non traitées.
Euh... sans voir les lignes en elle-même afin d'identifier la cause, difficile de se faire une idée du pourquoi ;-(
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
10 déc. 2012 à 22:53
oui je comprends,

demain je t'en verrai ca.

sinon peux tu me donner la syntaxe avec la commande sed pour ajouter un espace pour toutes les lignes qui comment par x500 ou x400 s'il te plaît ?

Je te remercie par avance
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 déc. 2012 à 22:55
Pour ajouter un espace où ?
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
10 déc. 2012 à 22:56
ah désolé, ajouter un espace en début de ligne

>x400

résultat
> x400

c'est possible ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 déc. 2012 à 22:57
Oui.

Par contre le chevron (>) fait partie de la ligne ?
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
10 déc. 2012 à 22:58
nan nan le chevon ne fait pas partie de ligne,

j'aurai du symboliser l'environnement linux comme ceci $

$x400
$ x400
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 déc. 2012 à 23:01
$ echo -e "${A}" 
x400 blabla
x500 bli bli
x600 bloblo

$ echo -e "${A}" | sed '/^x[45]00/{s/^/ /}'
 x400 blabla
 x500 bli bli
x600 bloblo

$
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
10 déc. 2012 à 23:03
merci beaucoup,

demain je vais essayer ta commande et je te dirais si c'est ok.

Bonne soirée
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
11 déc. 2012 à 20:23
j'ai essayé la commande est le résultat est correct, merci beaucoup.

J'aurai une question à te poser, toujours avec sed, est ce qu'il est possible de rajouter une une ligne vide entre deux blocs, je m'explique
voici la structure de mon fichier ldif


dn: CN=........................
changetype: add
objetclass:................................
blabla
blabla
blabla
mail= toto@tata.fr
dn: CN=........................
changetype: add
objetclass:................................
blabla
blabla
blabla
mail=essai@comment.com

je voudrais rajouter une ligne vide juste après l'attribut mail pour séparer le premier bloc et le second bloc et ainsi de suite pour obtenir le résultat suivant

dn: CN=........................
changetype: add
objetclass:................................
blabla
blabla
blabla
mail= toto@tata.fr

dn: CN=........................
changetype: add
objetclass:................................
blabla
blabla
blabla
mail=essai@comment.com

merci par avance pour ton aide
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
11 déc. 2012 à 22:20
sed 's/^mail=.*/&\n/' fichier
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
12 déc. 2012 à 07:23
En y repensant, y'a plus simple :

sed '/^mail=/{G}' fichier
;-))
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
12 déc. 2012 à 11:46
salut,

j'ai essayé les deux commandes que tu m'as donné

sed 's/^mail=.*/&\n/' fichier

sed '/^mail=/{G}' fichier

et dans mon fichier, je n'ai pas de changement, il n'y pas de ligne vide entre les deux blocs.

le soucis vient d'où?
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
12 déc. 2012 à 11:48
fausse alerte, ça marche très bien, j'avais mis un mail= au lieu de mail:

Merci pour ton aide
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
12 déc. 2012 à 11:51
toujours dans la même idée

peux tu me dire comment supprimer dans ce même fichier avec sed

toutes les lignes commençant par textEncodedORAAddres:


Merci pour ton aide
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
12 déc. 2012 à 11:54
sed '/^textEncodedORAAddres:/d' fichier
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
12 déc. 2012 à 11:55
Et avant les prochaines questions : FAQ - SED ;-))
0
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
12 déc. 2012 à 21:01
Salut, sais-tu s'il existe le même genre de pages pour awk ?
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
12 déc. 2012 à 20:15
ok pas de soucis.

Merci beaucoup pour toutes ces réponses rapides et efficaces.

Bonne soirée
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
12 déc. 2012 à 20:48
Là j'ai cherché sur le FAQ et je n'ai pas trouvé la réponse.

Je me posais la question comment ajouter une ligne vide juste avant la chaîne de caractère trouvée.
je voudrais ajouter une ligne vide pour séparer les deux blocs mais en raisonnant différemment car j'ai constaté qu'en traitant mon fichier ldif, les deux blocs ne sont pas séparés car certain bloc ne se termine pas par mail=toto@tata.fr et donc sed ne réalise pas l'opération car ca ne match pas.
Donc je raisonne dans l'autre sens c'est à dire toute chaîne commençant par
dn: CN=, ajouter une ligne vide au dessus pour donner ce résultat :

dn: CN=........................
changetype: add
objetclass:................................
blabla
blabla
blabla
mail= toto@tata.fr

dn: CN=........................
changetype: add
objetclass:................................
blabla
blabla
blabla
GivenName: allo allo allo


dn: CN=........................
changetype: add
objetclass:................................
blabla
blabla
blabla
GivenName: allo allo allo
mail=essai@comment.com

;) vi

début de commande

sed 's/^dn:.*//' comment dire ajouter une vide au dessus ?

Crois-tu que c'est faisable ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
12 déc. 2012 à 22:45
sed '/^dn:.*/{s//\n&/}' fich 
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
13 déc. 2012 à 17:43
Bonjour,

merci pour votre réponse ça marche très bien.

j'ai du mal à faire fusionner toutes chaines commençant par
"x400:" ou "x500" la ligne précédente.

proxyAddresses:
x500:C=toto:A=tata:P=coucou..........
proxyAddresses:
x400:C=toto:A=tata:P=coucou..........
proxyAddresses:
X500:C=toto:A=tata:P=coucou........


pour obtenir ceci

proxyAddresses: x400:C=toto:A=tata:P=coucou..........
proxyAddresses: X500:C=toto:A=tata:P=coucou..........
textORAENCODED: x500:C=toto:A=tata:P=coucou..........
.................................................................


sed -i '/^[xX][45]00:/ ;)...............': comment lui dire fusionne à la ligne précédente

Je commence à prendre goût à la manipulation des chaines de caractères, on voit bien la puissance sous Linux/Unix.

Je te remercie par avance
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
13 déc. 2012 à 17:47
j'ai du mal à faire fusionner toutes chaines commençant par "x400:" ou "x500" la ligne précédente.

Hein ? ;-((
0
ced66666 Messages postés 19 Date d'inscription lundi 10 décembre 2012 Statut Membre Dernière intervention 13 décembre 2012
13 déc. 2012 à 18:14
désolé, j'ai écris trop vite:

j'ai du mal à fusionner toutes chaines commençant par
"x400:" ou "x500" à la ligne précédente. (faire remonter à la ligne du dessus).
Comme ceci:

proxyAddresses:
x500:C=toto:A=tata:P=coucou..........
proxyAddresses:
x400:C=toto:A=tata:P=coucou..........
proxyAddresses:
X500:C=toto:A=tata:P=coucou........


pour obtenir ceci

proxyAddresses: x400:C=toto:A=tata:P=coucou..........
proxyAddresses: X500:C=toto:A=tata:P=coucou..........
textORAENCODED: x500:C=toto:A=tata:P=coucou..........
.................................................................

Merci par avance
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
13 déc. 2012 à 18:29
textORAENCODED:
D'où il sort lui ???

sed 'N;/\nx[45]00/{s/\n/ /}' fichier 
0