2

我正在做一个 cocos2dx 项目,最近我们更新到了最新版本的 cocos2dx,这引入了一些我正在清理的警告。

我有很多代码,例如:

CCPoint somePoint = ccpAdd(this->getPosition(), _someRandomOffset);

不推荐使用 ccpAdd 方法,支持 + 运算符,我想替换此类实例。我试过在谷歌上搜索,但我不知道如何使用 sed 提取两个字符串并将它们重新组合在一起。

CCPoint somePoint = this->getPosition() + _someRandomOffset;

我的问题是,如何使用针对我的源文件的一些脚本自动执行此替换?

如果 sed 命令可以处理嵌套的 ccpAdd 命令,则加分,例如:

CCPoint somePoint = ccpAdd(this->getPosition(), ccpAdd(one, two));

或者也许 sed 是该工作的错误工具?

4

3 回答 3

1

我认为

sed 's/ccpAdd(\(.*\),\(.*\))/\1+\2/g'

成功了。

但是,这不适用于嵌套出现,并且会在单行上多次出现该模式时产生奇怪的结果。

不幸的是,sed 没有非贪婪运算符,因此必须通过切换到另一个工具来解决第二个问题,例如perl

perl -pe 's|ccpAdd\((.*?),(.*?)\)|\1 + \2|g'

为了使嵌套正确,您可以多次重新运行相同的perl命令,直到没有更多匹配项为止(由于非贪婪运算符,这是有效的)。

于 2013-09-12T08:32:34.417 回答
1

pyparsing中使用具有递归性的模块的替代方法:

假设内容infile为:

CCPoint somePoint = ccpAdd(this->getPosition(), _someRandomOffset);
CCPoint somePoint = ccpAdd(this->getPosition(), ccpAdd(one, two));

并且script.py作为:

from pyparsing import *

parser = Forward()
parser << Literal('ccpAdd').suppress() \
    + Literal('(').suppress() \
    + ( parser | OneOrMore(CharsNotIn(',')) ) \
    + Literal(',').suppress() \
    + ( parser | OneOrMore(CharsNotIn(',)')) ) \
    + Literal(')').suppress()

parser.setParseAction(lambda t: ' + '.join(t))

with open('infile', 'r') as f:
    for line in f:
        r = parser.transformString(line)
        print(r, end='')

像这样运行它:

python3 script.py

这会产生:

CCPoint somePoint = this->getPosition() +  _someRandomOffset;
CCPoint somePoint = this->getPosition() + one +  two;
于 2013-09-12T09:11:54.627 回答
-1

我会做的是使用

sed 's/regex to match the old string/new string/'

然后将其写入文件。所以它会是这样的:

sed 's/regex to match the old string/new string/' > file

当然要为 sed 提供输入,只需重定向 cat 的标准输出:

cat thefile.txt | sed ...
于 2013-09-12T07:58:44.827 回答