A Questions pour les experts en expression régulière / sed: J'ai besoin d'embellir du code C ++. Le code est jonché de différentes versions de l'opérateur d'affectation avec différents types d'espacement. c'est à dire.

a=b
a =b
a= B
a  = b
a=  b
A = B. // the correct format needed, and so must be ignored by SED

Il ne devrait y avoir qu'un seul espace autour du =. Si vous en trouvez plus, les extras doivent être supprimés.

J'ai besoin de créer un script qui analysera tous les fichiers du dossier et des sous-dossiers et recherchera et remplacera si nécessaire.

Il y a quelques variantes, comme le a + = b etc.

Je cours sur OsX mais j'ai des machines Linux et Windows disponibles.

Aide très appréciée.

2
Mikkie 6 avril 2017 à 20:26

2 réponses

Meilleure réponse

Vous pouvez utiliser ce sed pour insérer un seul espace avant et après tous les opérateurs =:

Fichier d'entrée:

cat file
a          ==b
a=b
a =b
a/=b
a *=b
a+= b
a-=   b
a= B
a%= B
a  = b
a=  b
A = B

Commande sed:

sed -E 's~[[:blank:]]*([-+*/%=]?=)[[:blank:]]*~ \1 ~g' file

a == b
a = b
a = b
a /= b
a *= b
a += b
a -= b
a = B
a %= B
a = b
a = b
A = B

C'est l'expression régulière utilisée pour la correspondance (en utilisant ~ comme délimiteur):

  • ~[[:blank:]]*([-+*/%=]?=)[[:blank:]]*~ - correspond à 0 ou plusieurs espaces blancs suivis d'un caractère -+*/%= facultatif avant un littéral =. Nous capturons également cet opérateur dans le groupe # 1

Ceci est un motif utilisé en remplacement:

  • ~ \1 ~ Ce qui signifie un espace avant et après la chaîne capturée dans le groupe n ° 1
1
anubhava 6 avril 2017 à 19:56

Cela peut vous intéresser de le faire avec Perl

Un simple file.cpp:

#include <iostream>

int main(){
    int i =          3;
    i     += 3;
    i-=3;
    i   *  =    3; // not valid just for sure
    i/=3;

    int i2
    =
    3;

    if( i
       =
       = i2 ){} // not valid just for sure
}

perl -lpe '$/=undef;s/\s*([=!%\*\/+-])?\s*(=)\s*/ $1$2 /g' file.cpp

Le résultat:

#include <iostream>

int main(){
    int i = 3;
    i += 3;
    i -= 3;
    i *= 3;
    i /= 3;

    int i2 = 3;

    if( i == i2 ){}
}
0
Shakiba Moshiri 6 avril 2017 à 19:32