В конечном счете, 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
в вашем примере). Действия, когда это распознается, являются:
p
- вывести распознанную строку.
a
- добавить следующие строки к выходу; в этом случае одна строка содержит инструкцию возврата, которая является суммой двух запомненных имен аргументов. Обратная косая черта указывает, что есть еще одна строка вывода для добавления. Скобки группируют операции вместе.
Некоторые версии sed
поддерживают более мощные регулярные выражения, чем другие; Однако я не уверен, что даже GNU sed поддерживает PCRE (регулярные выражения, совместимые с Perl), и потребуется что-то вроде PCRE, чтобы значительно сократить регулярное выражение.
Обратите внимание, что этот скрипт оставляет строку комментария '// function implementation
' без изменений. Это ваш звонок, что вы делаете с этим.
Наконец, помните, что если вы пишете более одной функции для сложения двух целых чисел, вы тратите впустую код. Следовательно, это не правдоподобная трансформация. Каждая функция должна делать что-то свое. Конечно, если типы каждый раз разные, то, возможно, у него есть свои применения, но даже в этом случае было бы проще написать генератор, чем разобрать скелет и заполнить биты. И это может быть хорошим упражнением для сценариев.