Traitement fichier d'erreur par sed....

Résolu/Fermé
sebmas - 5 janv. 2010 à 17:48
 sebmas - 7 janv. 2010 à 10:07
Bonjour,
je viens vers vous car je suis perdu perdu avec sed..je n'y arrive plus et plus je touche moins cela marche...lol

je vous explique, j'ai un fichier de retour d'erreur email que je souhaite remettre en forme :

Fichier de départ :
Final-Recipient: RFC822; XXX@XX.org
Diagnostic-Code: SMTP; 554 Mail for XXXX@XX.org rejected for policy reasons.Last-Attempt-Date: Tue, 5 Jan 2010 08:21:26 +0100
X-MailidCpg: 367
X-MailidCpg: 367
Final-Recipient: rfc822; XXX@XX.org
Diagnostic-Code: smtp; 552 5.2.2 Over quota
X-MailidCpg: 367
X-MailidCpg: 367
Final-Recipient: rfc822; XXX@XX.org
Diagnostic-Code: smtp; 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)
X-MailidCpg: 367
Final-Recipient: rfc822; XXX@XX.org
Diagnostic-Code: smtp; 550 You must check your mail from this IP or SMTP Auth before sending to XXX@XX.org
X-MailidCpg: 367



et je souhaite concatener sur la même ligne le Final-recipient:........#Diagnostic-Code: ..........#X-MailidCpg: avec un # ou simplement Final-recipient:........#Diagnostic-Code: ..........# s'il n'y a pas de X-MailidCpg

voila mais je suis perdu.

j'avais fait un truc dans le style avant quand je ne géré pas la ligne X-MailidCpg:

/^Final-Recipient:/{
N
s/\n/#/
/^Diagnostic_Code:/{
N
s/\n/#/
}
p
}
A voir également:

8 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
5 janv. 2010 à 18:51
Salut,

[tmpfs]$ cat plop
Final-Recipient: RFC822; XXX@XX.org
Diagnostic-Code: SMTP; 554 Mail for XXXX@XX.org rejected for policy reasons.Last-Attempt-Date: Tue, 5 Jan 2010 08:21:26 +0100
X-MailidCpg: 367
X-MailidCpg: 367
Final-Recipient: rfc822; XXX@XX.org
Diagnostic-Code: smtp; 552 5.2.2 Over quota
X-MailidCpg: 367
X-MailidCpg: 367
Final-Recipient: rfc822; XXX@XX.org
Diagnostic-Code: smtp; 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)
X-MailidCpg: 367
Final-Recipient: rfc822; XXX@XX.org
Diagnostic-Code: smtp; 550 You must check your mail from this IP or SMTP Auth before sending to XXX@XX.org
X-MailidCpg: 367

[tmpfs]$ sed -n '
/^Final-Recipient:/{
:z
N
/.*\n\(Final-Recipient:\|$\)/!{
s/\n/#/
b z
}
P
D
}
' plop
Final-Recipient: RFC822; XXX@XX.org#Diagnostic-Code: SMTP; 554 Mail for XXXX@XX.org rejected for policy reasons.Last-Attempt-Date: Tue, 5 Jan 2010 08:21:26 +0100#X-MailidCpg: 367#X-MailidCpg: 367
Final-Recipient: rfc822; XXX@XX.org#Diagnostic-Code: smtp; 552 5.2.2 Over quota#X-MailidCpg: 367#X-MailidCpg: 367
Final-Recipient: rfc822; XXX@XX.org#Diagnostic-Code: smtp; 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)#X-MailidCpg: 367
Final-Recipient: rfc822; XXX@XX.org#Diagnostic-Code: smtp; 550 You must check your mail from this IP or SMTP Auth before sending to XXX@XX.org#X-MailidCpg: 367

[tmpfs]$

;-))
0
merci sympa ton aide, je le teste dés demain matin.

peux tu m'expliquer un peu ta methode pour que je progresse en SED;-)

Merci

cette methode fonctionne si j'ai des lignes sans X-MailidCpg: ??
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
5 janv. 2010 à 20:29
-n
Affichage à la demande

/^Final-Recipient:/{

Si la ligne commence par... (on définit un ensemble de règles à appliquer entre les accolades)

:z
On définit une étiquette

N
On ajoute la ligne suivante


/.*\n\(Final-Recipient:\|$\)/!{
Si la ligne n'est pas suivie (négation avec "!") après son dernier saut de ligne (matérialisé par \n), de "Final-Recipient:" ou de la dernière ligne (matérialisée par "$")


s/\n/#/
On remplace le saut de ligne par un dièse


b z
Puis on se branche à l'étiquette pour ajouter une nouvelle ligne


}
Fin des règles s'appliquant à la négation.
Derrière s'appliquent les règles définies si la ligne dans l'espace de travail contient "Final-Recipient:" ou la dernière ligne ($) après un caractère de fin de ligne...


P
On imprime la ligne contenu dans l'espace de travail de son début jusqu'au 1er saut de ligne (\n)


D
On efface tout jusqu'au 1er saut de ligne (\n) (en fait on efface ce qu'on vient d'imprimer) et on reprend le cycle au début du script sans charger une nouvelle ligne. En fait à ce moment là, l'espace de travail comprend "^Final-Recipient:".


}
On referme la 1ère accolade


cette methode fonctionne si j'ai des lignes sans X-MailidCpg: ??
Oui.


Voir dans la FAQ : Les pages consacrées à SED

;-))
0
Impec, je vais maintenant chercher comment eviter de me retrouver avec ce type de ligne :

Final-Recipient: rfc822; ploneux@domotec.fr#Diagnostic-Code: smtp; 554 5.1.0 Sender Denied#X-MailidCpg: 367#Diagnostic-Code: smtp; 550 <pascal.clerc@dtclim.fr>, Recipient unknownLast-attempt-Date: Tue, 05 Jan 2010 08:05:32 +0100#X-MailidCpg: 367

plutot que :

Final-Recipient: rfc822; XX@XX.fr#Diagnostic-Code: smtp; 554 5.1.0 Sender Denied#X-MailidCpg: 367

il faudrait que je compte soir le nombre de ligne a ajouter a Final-Recipient: (2 lignes au max) soit l'enchainement #Diagnostic-Code: puis #X-MailidCpg:

mais j'avaoue que c dur dur sed même avec les 3 partie du tuto SED...je pédale dans la semoule...lol

merci de votre aide.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
6 janv. 2010 à 11:34
Essaie comme ça :

sed -n '
/^Final-Recipient:/{
:z
N
/.*\n\(Final-Recipient:\|$\)/!{
s/\n/#/
s/\(\(.[^#]*\)\{3\}\).*/\1/
b z
}
P
D
}
' plop
0

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

Posez votre question
c nickel comme ca, il me faut juste essayer de bien comprendre pour le modifier,
en effet s'il y a un # dans le message je suis dans la panade, il vaut mieux que je recherche un caracétere qui ne soit pas utilisé dans les messages d'erreur de serveur d'email.

merci merci Monsieur jipicy
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
6 janv. 2010 à 14:30
De rien ;-))
0
cette expression fait quoi exactement, elle compte depuis le debut du pattern le nombre de # et remplace par l'element selectionné (2 premier #) quand il y en a deja 3..

s/\(\(.[^#]*\)\{3\}\).*/\1/

;-)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
6 janv. 2010 à 14:58
En fait elle ne compte pas exactement. Elle recherche une expression régulière définit comme suit :

.[^#]*
Une suite de caractères quelconques excepté le caractère dièse (#)

(...)\{3\}
et ceci 3 fois

.*
suivie d'une suite de caractères quelconques jusqu'à la fin de la ligne


On aurait pu l'écrire comme ça aussi (c'est d'ailleurs comme ça que je l'ai testé en 1er) :

s/\(.[^#]*\)\(.[^#]*\)\(.[^#]*\).*/\1\2\3/


PS. Merci lami20j ;-))
0
Salut,

Je n'ai pas le niveau de Jipicy en sed.
Pour comprendre une regex il faut la lire caractère par caractère

s      - substitute mais tu le sais déjà ;-)
/      - séparateur mais tu le sais déjà ;-)
\(     - DEBUT 1ère capture
\(     - DEBUT 2ème capture, mais dans ce cas son rôle et plutôt de grouper pour appliquer un quantifiqateur
.      - n'importe quel caractère sauf \n
[^#]*  - tout caractère sauf # zéro, une ou n'importe combien des fois
\)     - FIN 2ème capture (groupement)
\{3\}  - 3 foit seulement  le groupement
\)     - FIN 1ère capture
.*     - n'importe quel caractère zéro,une ou n'importe combien des fois
/\1/   - on remplace avec ce qui capture la 1ère (on compte toujours en parant de gauche)


P.S. La question n'a rien à avoir avec le message initial. Vaut mieux de créer un nouveau thread pour un nouveau problème.
0
Re,

P.S. La question n'a rien à avoir avec le message initial. Vaut mieux de créer un nouveau thread pour un nouveau problème

Oups, je me suis trompé ;-( . Je n'ai pas regarder plus haut.
Désolé.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
6 janv. 2010 à 15:04
Salut,

Je n'ai pas le niveau en sed.
Ça c'est toi qui le dit. Avec tes connaissances en Perl et autres, y'a pas de souci...

Par contre en regex t'es loin devant nous tous ici ;-))
0
lami20j > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
6 janv. 2010 à 17:36
Re,

Par contre en regex t'es loin devant nous tous ici ;-))
C'est gentil, mais je pense plutôt que le fait de penser chacun d'entre nous (quand je dis nous c'est pas que toi est moi) à des solutions, ça nous permets d'apprendre toujours.
On ne voit pas tous les choses de la même façon et ça c'est très intéressant est instructif en même temps.
0
green day Messages postés 26371 Date d'inscription vendredi 30 septembre 2005 Statut Modérateur, Contributeur sécurité Dernière intervention 27 décembre 2019 2 162 > lami20j
6 janv. 2010 à 17:38
Salutation ;-)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894 > lami20j
6 janv. 2010 à 17:39
+1 pour tout ;-))

Dans la vie on est toujours pauvre de savoir.
0
+1 et milles merci pour vos explications

Sébastien
0