Bash: problème de protection de texte

Résolu/Fermé
Arcturus - 11 août 2010 à 18:12
 Arcturus - 11 août 2010 à 19:51
Bonjour,

J'ai un petit soucis avec un de mes scripts Bash.

Pour des raisons techniques trop longues a expliquer je suis obligé de faire un script fusionnant des fichiers c++
Tout fonctionne bien excepté un détail gênant: Les commentaires multi-lignes (avec /*blabla */)

Voila mon bout de code problématique:

for ficH in $ListH;       	#For each .h file
do
	for line in $(cat $ficH)  #For each line
	do			
		
		if (petit test sans importance)
		then 
			echo "$line" >> $allH	#Write at the end of the all.h file
		fi
	done
done



Le problème est que, si je croise une ligne du genre:

/*
* Copyright (c) 2010 blablabla
* blablabla
*/



la premiere ligne (le /*) va être interprétée ce qui me renverra mon arborescence linux donc le resultat serra un truc du genre

/bin
/boot
[...]
/var
* Copyright (c) 2010 blablabla
* blablabla
*/



Je voudrais éviter de supprimer les commentaires ou de faire une usine a gaz avec 36 tests. Est ce que vous auriez une solution simple?
Le problème vient certainement de mes guillemets autour du $line mais je ne sais pas comment les remplacer. J'ai testé avec des '', des '' et même des """""" (triples guillemets, si je me souviens de mes cours il me semble que ça peut servir mais je sais plus exactement quand ^^) . Mais rien de fonctionne :(


Merci d'avance pour l'aide ^^


PS: J'avais d'abord posté sur le forum linux mais en fait je me dis que j'aurais peut-etre plus de réponses ici. Donc désolé pour le double sujet

3 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 897
11 août 2010 à 18:20
Salut,

$ cat plop
/*
* Copyright (c) 2010 blablabla
* blablabla
*/

$ while read line;do echo "${line/\//\\}";done < plop
\*
* Copyright (c) 2010 blablabla
* blablabla
*\

$

;-))
0
Salut, merci pour la réponse rapide =)

Le problème dans ce cas, c'est que les /* sont transformés en \*, ce que le compilateur apprécie assez moyennement :D Et de manière général, ça fait aussi planter les commentaires uniligne (commençant par // qui deviennent \//)

PS: En fait j'ai voulu tester dans mon cas et ça pose même un problème supplémentaire:

\bin
\boot
[...]
\var
* Copyright (c) 2010 blablabla
* blablabla
*/


Il interprète quand même le /* et replace les / apres coup.
Je ne sais pas pourquoi... Le pire étant que j'ai exactement le même morceau de code sur les fichiers .C/.cpp et que la les commentaires sont bien pris en compte correctement (pas d'interprétation des /* alors que c'est aussi un echo "$line" que je fais). Je ne comprend vraiment pas :/
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 897
Modifié par jipicy le 11/08/2010 à 19:16
Oups sorry :

"${line/\///}"


Édit : Je suis un âne, pas besoin de substitution ;-\

$ while read line;do echo "${line}";done < plop
/*
* Copyright (c) 2010 blablabla
* blablabla
*/


;-\
0
Re!

En effet, avec un while ça fonctionne, merci beaucoup =)

Par contre, je ne comprend pas pourquoi avec un :

for line in $(cat ./plop)
do	
	echo "$line" 
done


Ca ne tourne pas de la même manière chez moi. Pourtant ça me semble être la même chose au final (a noter que j'ai bien redéfini l'IFS). Le for et le while de récupèrent pas les lignes sous la même forme?

Enfin l'important c'est qu'au final ca tourne! Merci encore ;)
0