IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

remplacer des #defines avec SED


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut remplacer des #defines avec SED
    Bonjour, j'ai rien trouvé de tel en cherchant, donc voilà ma question (assez urgente d'ailleurs):

    Je cherche à remplacer des #defines de plusieurs headers et sources de C++ avec SED.
    En détail, je veux pouvoir remplacer d'une un
    #define QUELCONQUE avec //#define QUELCONQUE
    et vice versa.

    actuellement mon paramètre pour sed ressemble a cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    's/#define\[:blank:]QUELQCONQUE/\//#define\[:blank:]QUELCONQUE/g'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    's/\//#define\[:blank:]QUELQCONQUE/\#define\[:blank:]QUELCONQUE/g'
    en fait, vu que j'appelle ceci dans script.sh, cela donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    's/#define\[:blank:]'${1}'/\//#define\[:blank:]'${1}'/g'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    's/\//#define\[:blank:]'${1}'/\#define\[:blank:]'${1}'/g'
    Des idées comment réaliser ce que je veux obtenir ou des alternatives?
    Je suis preneur de tout ce qui peut m'avancer dans mon problème.

    (Nota: je travaille sous cygwin, vu que j'ai besoin d'un autre soft Windows (CodeWarrior) pour mon travail).

  2. #2
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    Gère les lignes commençant par 0 à n espaces ou tabulations suivies de #define dans le 1er cas et //#define dans le 2ème cas.
    http://www.shellunix.com/regexp.html


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed "s/^\([ \t]*\)#define  *${1}/\1\/\/#define ${1}/" fichier.txt > resul
    sed "s/^\([ \t]*\)\/\/#define  *${1}/\1#define ${1}/" resul > resul2

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 145
    Par défaut
    Dans ce genre de cas assez particulier, je préfère l'utilisation de perl avec les options -pi.

  4. #4
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    Citation Envoyé par milouz123 Voir le message
    Dans ce genre de cas assez particulier, je préfère l'utilisation de perl avec les options -pi.

    Merci pour cette remarque très intéressante
    Je pense que Kurisu appécierait de savoir comment tu fais ça en perl.

  5. #5
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Hé bien perso je préfère la commande awk, que je trouve plus lisible. Pour preuve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    awk '{if ($1 ~ /#define/ && $2 ~ /bidule.h/) printf "// %s\n", $0; else print $0}' main.cpp > main.cpp.tmp
    mv main.cpp.tmp main.cpp
    Pas besoin de s'embêter avec les blancs et les espaces, awk comprend très bien tout seul .

  6. #6
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    La solution en Perl m'intéresse aussi, pour sûr. Et merci pour la solution avec awk.
    Au passage, awk conserve bien les droits du fichier ou il faut faire comme avec sed? (Ou alors le paramètre -i ? )

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 145
    Par défaut
    La ligne ci-dessous modifie directement les fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -pi -e 's,^(#define\s*QUELCONQUE),//$1,' *.h *.c
    Pour conserver un backup des fichiers modifiés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -p -i.old -e 's,^(#define\s*QUELCONQUE),//$1,' *.h *.c
    Note : en sed et en perl, je ne sais plus en awk, on peut utiliser le séparateur de son choix. L'utilisation de ',' à la place de '/' évite d'avoir à déspécifier les '//' dans la chaîne de remplacement.

  8. #8
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    J'ai un peu modifié la solution donnée pour sed parce qu'elle ne fonctionnait pas (sans rancune, j'y ai perdu des nerfs pour la faire fonctionner).
    Voici donc ma solution un peu modifiée:

    comment in
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #! /bin/bash
     
    myParam=$1
    myFile=$2
     
    sed -e "s/^[ \t]*\/\/#define[ \t]*${1}/#define ${1}/g" $2
    comment out
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #! /bin/bash
     
    myParam=$1
    myFile=$2
     
    sed -e "s/^[ \t]*#define[ \t]*${1}/\/\/#define\t${1}/g" $2
    merci encore pour vos solutions.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 145
    Par défaut
    Attention toutefois au fait que le caractère de tabulation '\t' ne fonctionnera pas avec toutes les implémentations de sed. Sur certains Unix, le caractère tabulation est décrit par la séquence clavier : Ctrl-v tab

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/12/2014, 17h43
  2. Ajouter des caractères avec sed
    Par ldiaz dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 19/07/2012, 10h17
  3. Remplacer des caractères avec la fonction string.replace
    Par chtom dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/12/2008, 16h43
  4. suppression des lignes avec sed
    Par dngaya dans le forum Linux
    Réponses: 1
    Dernier message: 29/09/2008, 21h23
  5. [RegEx] Remplacement des accents avec une regex
    Par benohit dans le forum Langage
    Réponses: 7
    Dernier message: 07/09/2006, 18h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo