2009-11-08 22 views
5

Próbuję przekonwertować następujący:Jak mogę dokonać warunkowej zamiany w Perlu?

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

do:

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

Innymi słowy, trzeba usunąć definicję typu na liniach, które nie są definicja funkcji.

Używam systemu Linux.

Poniższa usuwa pisać na obu liniach:

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

Jak mogę wymienić tylko na linii zaczynającej się od „powrotu” i jeszcze wprowadzić wiele zmian na tej samej linii?

Odpowiedz

8

Dodaj if oświadczenie:

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

Alternatywnie, można wykorzystać, że ciąg przekazać do perl -p jest ciało pętli:

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

ah - oczywiście! Dzięki. – user204884

+2

Dobrze jest zobaczyć ostrzeżenia, nawet w onelinerach, więc dodaj -w (lub pakiet jako -wpe). – ysth

0

Można po prostu umieścić coś w dopasowaniu -> w regex, więc nie pasuje do definicji funkcji. Jeszcze lepiej byłoby napisać skrypt, który parsuje wiersz po wierszu i odrzuca linie bez znaku -> zanim nawet wykona zamianę.

+0

Would not I wtedy trzeba pamiętasz wszystkie pola do rekompozycji w zastępstwie? – user204884

+0

Czy trudno to zrobić? –

+0

Liczba parametrów w funkcji może oczywiście różnić się – user204884

Powiązane problemy