2013-09-12 3 views
2

Я работаю над проектом cocos2dx, и недавно мы обновили последнюю версию cocos2dx, это привело к ряду предупреждений, которые я убираю.извлечение нескольких подстрок из строки с помощью sed

У меня есть много кода, как:

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

Метод ccpAdd осуждается в пользу оператора +, я хочу, чтобы заменить такие экземпляры. Я пробовал поиск в google, но я не могу узнать, как извлечь две строки с помощью sed и собрать их вместе.

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

Мой вопрос в том, как я могу автоматизировать эту замену, используя какой-то скрипт для моих исходных файлов?

Бонусные баллы, если СЭД команда может обрабатывать вложенные команды ccpAdd, как:

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

Или, может быть, SED неправильный инструмент для работы?

+0

сделали вы пишете свои коды в некоторых IDE? было бы безопаснее использовать его восстановительную функцию. например, ваши коды могут быть '... = ccpAdd (..); другой оператор без новой строки;' или '... = ccpAdd (func (func2 (a, b), x), ccpAdd (foo, bar)); ' – Kent

+0

Я использую Xcode ... Я посмотрю – jonynz

+0

no go, выглядит как XCode только рефакторы C или объектив C – jonynz

ответ

1

Я думаю

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

делает трюк.

Это, однако, не работает для вложенных вхождений и приведет к появлению странных результатов для нескольких вхождений шаблона в одной строке.

К сожалению, seddoesn't have non-greedy operators, поэтому вторая проблема должна быть решена путем перехода на другой инструмент, скажет perl:

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

Чтобы получить вложенности права, вы можете просто повторно запустить несколько раз же perl команды пока не будет больше совпадений (это работает из-за неживых операторов).

+0

спасибо, работает скрипт perl работает красиво: D – jonynz

0

Что бы сделать, это использовать

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

, а затем записать его в файл. так что это будет что-то вроде этого:

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

и, конечно, обеспечить СЕПГ с вводом просто перенаправить стандартный вывод кошки:

cat thefile.txt | sed ... 
+0

Я бы предложил вам удалить этот ответ, прежде чем вы получите downvotes ... он не отвечает вопрос. – Kent

+0

Да, во многих случаях ccpAdd используют разные переменные, такие как ccpAdd (layer-> getPosition(), offset) и ccpAdd (в центре, offVect), поэтому он недостаточно общий, – jonynz

+0

не достаточно общий для регулярного выражения? –

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='') 

Run это нравится:

python3 script.py 

Это дает:

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

это тоже сработало, спасибо! – jonynz

+0

@jonynz: Рад это прочитать, и спасибо за подтверждение. Я не привык к подобному разбору, и хорошо, что это может быть полезно для кого-то. – Birei

Смежные вопросы