2009-11-08 37 views
5

我想如下轉換:如何在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); 
} 

換句話說,我需要刪除不屬於函數定義的行類型定義。

我正在使用Linux。

下消除了對兩行類型:

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

我怎麼只能更換與「迴歸」仍然在行開始就在同一行多次更改?

回答

8

添加if聲明:

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

或者,您可以使用您傳遞到perl -p字符串是一個循環的身體:

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

啊 - 當然!謝謝。 – user204884 2009-11-08 13:39:13

+2

很高興看到警告,即使在oneliners,所以添加-w(或捆綁爲-wpe)。 – ysth 2009-11-08 17:59:02

0

你可以在你的正則表達式中放一些東西來匹配 - >以便它與函數定義不匹配。更好的辦法是編寫一個腳本,逐行解析並在沒有 - >替代之前拒絕行。

+0

難道我接下來要記得所有的替換字段重新組合? – user204884 2009-11-08 13:37:47

+0

難以做到嗎? – 2009-11-08 13:39:02

+0

函數中的參數數量當然可能會有所不同 – user204884 2009-11-08 13:40:40