2009-11-08 16 views
5

Ich versuche wie folgt zu konvertieren:Wie kann ich eine bedingte Substitution in Perl durchführen?

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

zu:

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

Mit anderen Worten, ich brauche die Typdefinition auf den Leitungen zu entfernen, die nicht die Funktionsdefinition sind.

Ich benutze Linux.

Nachstehend entfernt den Typ auf beiden Leitungen:

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

Wie kann ich nur auf der Linie ersetzen mit ‚Rückkehr‘ beginnen und noch mehrere Änderungen auf der gleichen Linie machen?

Antwort

8

schreiben if Aussage:

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

Alternativ können Sie verwenden, dass die Zeichenfolge, die Sie ein Körper einer Schleife passieren perl -p ist:

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

ah - natürlich! Vielen Dank. – user204884

+2

Es ist gut, Warnungen zu sehen, sogar in oneliner, also fügen Sie ein -w (oder Bündel als -wpe) hinzu. – ysth

0

Sie könnten einfach etwas einfügen -> in Ihre Regex, damit es nicht mit der Funktionsdefinition übereinstimmt. Noch besser wäre es, ein Skript zu schreiben, das Zeile für Zeile zerlegt und Zeilen ohne -> vor der Ersetzung ablehnt.

+0

Wäre ich dann Merken Sie sich alle Felder für die Neuzusammensetzung im Ersatz? – user204884

+0

Ist es schwer, das zu tun? –

+0

Die Anzahl der Parameter in der Funktion kann natürlich variieren – user204884

Verwandte Themen