2009-11-08 6 views
5

Je suis en train de convertir comme suit:Comment faire une substitution conditionnelle en Perl?

bool foo(int a, unsigned short b) 
{ 
    return pImpl->foo(int a, unsigned short b); 
} 

à:

bool foo(int a, unsigned short b) 
{ 
    return pImpl->foo(a, b); 
} 

En d'autres termes, je dois supprimer la définition de type sur les lignes qui ne sont pas la définition de la fonction. J'utilise Linux. J'utilise Linux.

Le suivant supprime le type sur les deux lignes:

perl -p -e 's/(?<=[,(])\s*?(\w+)*.*?(\w*)(?=[,)])/ $2/g;' fileName.cpp 

Comment puis-je remplacer seulement sur la ligne commençant par « retour » et de faire encore plusieurs changements sur la même ligne?

Répondre

8

Ajouter une déclaration if:

perl -p -e 's/regex/replacement/g if /^\s*return/;' fileName.cpp 

Alternativement, vous pouvez utiliser cette la chaîne que vous passez à perl -p est un corps d'une boucle:

perl -p -e 'next unless /^\s*return/; s/add/replacement/g;' filename.cpp 
+0

ah - bien sûr! Merci. – user204884

+2

Il est bon de voir les avertissements, même dans les oneliners, alors ajoutez -w (ou bundle comme -wpe). – ysth

0

Vous pouvez simplement mettre quelque chose à faire correspondre -> dans votre expression régulière afin qu'elle ne corresponde pas à la définition de la fonction. Encore mieux serait d'écrire un script qui analyse ligne par ligne et rejette les lignes sans -> avant même de faire la substitution.

+0

Ne serait-je ensuite Rappelez-vous tous les champs pour la recomposition dans le remplacement? – user204884

+0

Est-ce difficile de faire ça? –

+0

Le nombre de paramètres dans la fonction peut bien sûr varier – user204884

Questions connexes