• [^] # Re: sed peut-être ?

    Posté par . En réponse au message Script pour modifier C++ sources. Évalué à 2.

    Je t'invite très fortement à lire un tutoriel sur les regex et/ou sur sed.

    tu pourrais faire un truc comme :
    sed -e 's/^class[^;]*$/namespace titi\n{ \n&/g' -e 's/^}$//' -e 's/^}$/&\n&/'

    quelques rappels rapide pour comprendre. Le caractère ^ représente le début de la ligne, $ : la fin de ligne, & : est remplacé par le motif recherché dans la chaine de substitution, \n : un retour chariot dans la chaine de substitution, < indique un début de mot, et >, une fin de mot. [^;] matche n'importe quel caractère sauf ;

    d'autre part, ton for file in `ls *.h` se remplace avantageusement par for file in *.h.
    Autre remarque, le ls n'étant pas récursif, ça ne fonctionera pas si ton arborescence n'est pas plate. find est là pour t'aider, genre :

    for i in `find . -name '**.h'

    sauf qu'on peut faire encore mieux avec l'option -exec de find, ou, encore mieux, avec xargs et l'option -i de sed (qui indique à sed de travailler directement sur le fichier en entrée)
    find . -name "*.h" | xargs sed -i -e 's/^class[^;]*$/namespace titi\n{ \n&/g' -e 's/^}$//' -e 's/^}$/&\n&/'

    encore quelques petites remarques:
    l'expression 's/^}$/&\n&/' est p-e pas assez fine. Elle dupliquera toutes les lignes ne contenant qu'une accolade fermante. Si ton contient des accolades fermantes qui ne sont pas des fermetures de classes, tu te retrouveras avec trop d'accolades après le traitement.
    Evidemment, il y a des solutions, à base de comptage d'accolades ouvrantes et fermantes, pour ne rajouter des accolades fermantes que quand il le faut.

    Si tu veux pouvoir relancer le script sans risquer de traiter deux fois le même fichier, tu peux rajouter un grep -c "\<namespace titi\>' pour faire quelque chose comme (on respire un grand coup :) :
    find . -name '*.h' | grep -c '\<namespace titi\>' | cut -d ':' -f 1 | xargs sed -i -e 's/^class[^;]*$/namespace titi\n{ \n&/g' -e 's/^}$//' -e 's/^}$/&\n&/'

    bon, ça fait p-e beaucoup ... Si tu prends bien le temps de comprendre chaque améloration que je propose, tu devrais pas mal progression dans ton approche des scripts shell.

    bon courage :)