Espaces supprimés en debut de ligne sur stdin

Fermé
Sylvain R. - 13 juil. 2007 à 13:38
 Sylvain R. - 13 juil. 2007 à 16:55
Bonjour, j'ai un petit soucis avec un programme shell au niveau de l'echange de donnée avec la sortie/entree standard.

J'ai besoin d'appeler un programme shell en lui passant un email en parametre.
Le probleme c'est que les en-tetes ont la forme suivante :

From xxxx@xxxxx.fr Fri Jul 13 13:06:55 2007
Received: from localhost (mx [117.220.18.15])
by plan.xxxxx.fr (8.13.8/8.13.4) with ESMTP id l6DB6t4M025705
for <xxxx@xxxxxx.fr>; Fri, 13 Jul 2007 13:06:55 +0200 (MEST)
Received: from plan.xxxxxx.fr ([117.220.18.60])
by localhost (tan.xxxxx.fr [117.220.18.15]) (amavisd-new, port 10041)
with LMTP id 09100-08 for <xxxx@xxxxx.fr>;
Fri, 13 Jul 2007 13:06:22 +0200 (MEST)

Il y a des espaces et tabulations en debut de lignes, et j'ai besoin de les conserver dans mon programme externe. J'enregistre l'entree standart dans un fichier temporaire de la facon suivante :

while read line
do
if [ "$line" = "*" ]
then echo \* >> $HOME/$tmp_mail
else
echo $line >> $HOME/$tmp_mail
fi
done

le if permet de traiter le cas ou ma ligne contiendrait seulement *, ce qui a pour consequence d'enregistrer tous les noms de fichiers du repertoire courant et non l'etoile. (si il y a une solution plus simple pour eviter ce desagrement je suis aussi preneur..)

Dans mon fichier $HOME/$tmp_mail, le mail devient :

From xxxx@xxxxx.fr Fri Jul 13 13:06:55 2007
Received: from localhost (mx [117.220.18.15])
by plan.xxxxx.fr (8.13.8/8.13.4) with ESMTP id l6DB6t4M025705
for <xxxx@xxxxxx.fr>; Fri, 13 Jul 2007 13:06:55 +0200 (MEST)
Received: from plan.xxxxxx.fr ([117.220.18.60])
by localhost (tan.xxxxx.fr [117.220.18.15]) (amavisd-new, port 10041)
with LMTP id 09100-08 for <xxxx@xxxxx.fr>;
Fri, 13 Jul 2007 13:06:22 +0200 (MEST)

Je vous en prie, aidez moi, j'ai passer 2jours sur le programme externe, et il me sert a rien sans les espaces et tabulations en debut de mail...

Merci infiniment pour vos reponses

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 895
13 juil. 2007 à 13:41
Salut,

Peux-tu s'il te plaît coller à nouveau to exemple de mail mais en le mettant entre les balises "Code" afin qu'il conserve les espaces et tabulations et qu'on puisse traiter ton probème au mieux ;-)

0
oups, désolé!

From xxxx@xxxxx.fr Fri Jul 13 13:06:55 2007
Received: from localhost (mx [117.220.18.15])
	by plan.xxxxx.fr (8.13.8/8.13.4) with ESMTP id l6DB6t4M025705
	for <xxxx@xxxxxx.fr>; Fri, 13 Jul 2007 13:06:55 +0200 (MEST)
Received: from plan.xxxxxx.fr ([117.220.18.60])
 by localhost (tan.xxxxx.fr [117.220.18.15]) (amavisd-new, port 10041)
 with LMTP id 09100-08 for <xxxx@xxxxx.fr>;
 Fri, 13 Jul 2007 13:06:22 +0200 (MEST) 
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
13 juil. 2007 à 13:53
(si il y a une solution plus simple pour eviter ce desagrement je suis aussi preneur..)
utiliser une simple quote dans laquelle le shell ne substitue pas : '*'
0
ca marche pas chez moi :

tanit: test='*'
tanit: echo $test
AmIinRDV Courrier ind&AOk-sirable Desktop Documents Drafts EI_1_214 ENV.10-11-06-13:57:36 ENV.15-09-06-09:36:34 ENV.18-09-06-15:35:36 IsSenderVIP  Mail M bash bashrc2.bak c...
0

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

Posez votre question
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
13 juil. 2007 à 15:43
étrange. quel shell ?
et avec test='\*'
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 895
13 juil. 2007 à 16:31
Re-

Essaye avec une boucle "for" et en changeant le séparateur d'entrée ($IFS) :
#! /bin/bash

OLDIFS=$IFS
IFS=$'\n'
for line in $(cat fichier)
do
if [ "$line" = "*" ]
then echo \* >> $HOME/$tmp_mail
else
echo -e "$line" >> $HOME/$tmp_mail
fi
done
IFS=$OLDIFS
;-))
0
Mon probleme c'etait de proteger le contenu d'une variable assignée de facon automatique. L'idéal serait que je n'ai pas besoin de faire moi meme la protection. Mais c'est pas grave, je vais susbtituer toutes les etoiles par \* avant de faire
echo $var >> fichier 


Pour le changement d'IFS j'essaierais ce soir (j'ai deja perdu tellement de temps sur cette co****), j'ai trouvé une solution temporaire en ajoutant un # en début de chaque ligne avant l'envoi a mon programme externe qui enregistre l'entrée standard dans un fichier, puis j'appel sed afin de supprimer le 1er caractère de chaque ligne et je réenregistre le tout dans un nouveau fichier... Je perd la distinction entre les tabulations et les espaces, mais Sendmail est content, il veut bien envoyé mon mail ainsi traité.

Merci encore pour vos reponses
0
grrr, mon problème avec l'etoile n'est pas résolu.

while read line
do
	#if [ "$line" = "*" ]
	#	then echo \* >> $HOME/${tmp_mail}2
	#else
		echo $line >> $HOME/${tmp_mail}2
	#fi
done


Ce n'est pas moi qui assigne le contenu des variables, je ne peut donc pas mettre \* à la place des étoiles. Et si $line par exemple contient :
X-Spam-status: *
le resultat c'est que dans mon fichier j'aurais :
X-Spam-status: AmIinRDV Courrier ind&AOk-sirable Desktop Documents Drafts EI_1_214 ENV.10-11-06-13:57:36 ENV.15-09-06-09:36:34 ENV.18-09-06-15:35:36 IsSenderVIP Mail M bash bashrc2.bak c...

Je remplacerais bien avec sed, mais il faut que j'evalue la variable avec echo $line | sed ... et il va deja me remplacer les etoiles par le contenu de mon dossier non ??
0