sed: изменить аргументы функции - PullRequest
2 голосов
/ 03 марта 2011

Я пытаюсь написать команду sed, которая позволит мне изменить аргументы функции. Количество аргументов может быть переменным.

Если это моя функция:

int myFunction(int arg1, int arg2, Dog arg3) {
    // function implementation
}

Я хотел бы иметь возможность выполнять операции сложения для int arg1, int arg2, ...

Вот что у меня не работает:

sed -e '/^[a-zA-Z0-9_]\+\s\+[a-zA-Z0-9_]\+(/ , /)[\n\s]*{/ {
    # arguments should be listed here
}'

Любая помощь приветствуется. Успокойся, это моя первая попытка сценариев sed / shell.

Спасибо.

1 Ответ

1 голос
/ 03 марта 2011

В конечном счете, sed не является правильным инструментом для этой работы - из-за вашего комментария о «количестве аргументов может быть переменным». Если вы имеете дело с фиксированным числом аргументов фиксированного типа, вы можете обойти его, но любая более общая обработка требует более общего процессора (чем sed).

Я предлагаю попробовать другую задачу, как ваше введение в сценарии оболочки и sed.

Если вы должны это сделать, то, возможно:

sed '/^[A-Za-z_][A-Za-z0-9_]*  *[A-Za-z_][A-Za-z0-9]* *([A-Za-z_][A-Za-z0-9_]*  *\([A-Za-z_][A-Za-z0-9_]*\) *, *[A-Za-z_][A-Za-z0-9_]*  *\([A-Za-z_][A-Za-z0-9_]*\)[ ,)].*{/{p;a\
    return \1 + \2;
}' $file

Этот ужас совпадения содержит последовательность [A-Za-z_][A-Za-z0-9_]* 6 раз; это соответствует идентификатору каждый раз. Сегмент из '[ ,)].*{ соответствует третьему или последующим аргументам. Возможно, пробелы в шаблоне должны быть классами символов '[<blank><tab>]', но их сложно ввести в StackOverflow. Затем регулярное выражение сопоставляет определение функции и захватывает (в частях '\(<identifier>\)' имена двух переменных (arg1 и arg2 в вашем примере). Действия, когда это распознается, являются:

  1. p - вывести распознанную строку.
  2. a - добавить следующие строки к выходу; в этом случае одна строка содержит инструкцию возврата, которая является суммой двух запомненных имен аргументов. Обратная косая черта указывает, что есть еще одна строка вывода для добавления. Скобки группируют операции вместе.

Некоторые версии sed поддерживают более мощные регулярные выражения, чем другие; Однако я не уверен, что даже GNU sed поддерживает PCRE (регулярные выражения, совместимые с Perl), и потребуется что-то вроде PCRE, чтобы значительно сократить регулярное выражение.

Обратите внимание, что этот скрипт оставляет строку комментария '// function implementation' без изменений. Это ваш звонок, что вы делаете с этим.

Наконец, помните, что если вы пишете более одной функции для сложения двух целых чисел, вы тратите впустую код. Следовательно, это не правдоподобная трансформация. Каждая функция должна делать что-то свое. Конечно, если типы каждый раз разные, то, возможно, у него есть свои применения, но даже в этом случае было бы проще написать генератор, чем разобрать скелет и заполнить биты. И это может быть хорошим упражнением для сценариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...