2009-11-08 49 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