2009-11-08 10 views
5

Sto cercando di convertire come segue:Come posso eseguire una sostituzione condizionale in Perl?

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

a:

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

In altre parole, ho bisogno di rimuovere la definizione del tipo sulle linee che non sono la definizione della funzione.

Sto usando Linux.

Il seguente rimuove il tipo su entrambe le linee:

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

Come posso sostituire solo sulla linea che inizia con 'ritorno' e ancora fare più modifiche sulla stessa linea?

risposta

8

Aggiungi un if dichiarazione:

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

In alternativa, si può utilizzare la stringa che si passa al perl -p è un corpo di un ciclo:

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

ah - ovviamente! Grazie. – user204884

+2

È bello vedere gli avvertimenti, anche nei oneliner, quindi aggiungi un -w (o bundle come -wpe). – ysth

0

Si potrebbe semplicemente mettere qualcosa per abbinare -> nella tua regex in modo che non corrisponda alla definizione della funzione. Ancora meglio sarebbe scrivere uno script che analizzi riga per riga e rifiuti le righe senza un -> prima ancora di fare la sostituzione.

+0

non dovrei quindi necessario ricorda tutti i campi per ricomposizione nella sostituzione? – user204884

+0

È difficile farlo? –

+0

Il numero di parametri nella funzione può naturalmente variare – user204884

Problemi correlati