Bash: problème de protection de texte
Résolu
Arcturus
-
Arcturus -
Arcturus -
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:
Le problème est que, si je croise une ligne du genre:
la premiere ligne (le /*) va être interprétée ce qui me renverra mon arborescence linux donc le resultat serra un truc du genre
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
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
A voir également:
- Bash: problème de protection de texte
- Bingo bash - Télécharger - Divers Jeux
- Bash list ✓ - Forum Shell
- Bash permission non accordée - Forum Shell
- Bash pause ✓ - Forum Shell
- Bash addition - Forum Programmation
3 réponses
Salut,
;-))
$ cat plop /* * Copyright (c) 2010 blablabla * blablabla */ $ while read line;do echo "${line/\//\\}";done < plop \* * Copyright (c) 2010 blablabla * blablabla *\ $
;-))
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:
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 :/
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 :/
Re!
En effet, avec un while ça fonctionne, merci beaucoup =)
Par contre, je ne comprend pas pourquoi avec un :
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 ;)
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 ;)