使用regex和sed命令替换C ++代码中的'*'指针是行不通的

时间:2014-07-21 14:13:06

标签: c++ regex ubuntu sed

我是一名处理C ++代码的新手程序员,我应该检讨和研究。我的基本任务之一是更改指针通知,如下所示:

char *name;

这个惯例:

char* name;

由于我的操作系统是Ubuntu 13.10,我认为正则表达式可以完成这项工作。我研究了一下,尝试了这样一个命令的不同变体:

find ./ -type f -exec sed -i -e 's/(?<=\w)\s\*(?!\s)/\* /g' {} \;

这应该被理解为:在字符串中查找一个字母数字,然后匹配空白后跟星号,后面跟着非空格,并用星号和空格替换。我明白,对于替换\ s不能使用,前方/后方不会进入比赛,所以我用命令玩了一点但收效甚微。 我首先尝试使用Eclipse IDE&#39; find&#39;菜单,正则表达式似乎是正确构建的,因为它真正找到了我的期望。但是当我尝试这个命令时,它没有像预期的那样改变线条,事实上它们仍然保持不变,没有受到影响。

我也在尝试上述较窄的情况,即将投射改为像这样的指针:

(char *) another_name

进入这个

(char*) another_name

使用此命令行:

find ./ -type f -exec sed -i -e 's/(?<=\w)\s\*(?=\))/\*/g' {} \;

但似乎正则表达式引擎无法识别转义的括号,因为它给了我&#34; sed:-e表达式#1,字符25:不匹配)或)&#34;。

现在我正在试图找出解决问题的正确方法:为什么替换不能按预期工作,以及为什么使用相同的命令而不是正面外观中的转义括号背后不被承认?

提前感谢您提供的任何建议。

2 个答案:

答案 0 :(得分:4)

sed不支持环绕声断言,启用-r标志并使用扩展正则表达式:

sed -i -r 's/(\w+)\s*\*(\w)/\1\* \2/g'

Ideone Demo

在Perl中,您可以使用外观断言:

perl -i -pe 's/(?<=\w)\s*\*(?=\w)/\* /g'

Ideone Demo

答案 1 :(得分:0)

&#34;一个处理C ++代码的新手程序员&#34;可能不应该自动化这个。您是否考虑过*用于乘法的案例

name * another_name

或取消引用?

Type t = *it;

你似乎认为C ++在圆括号内投射

(char*) name
实际上它们通常出现在角度内部

static_cast<char*>(name)

....

你最好亲自动手去做,以便更好地了解你正在处理的事情。