У меня есть функция TRIAL_FUNC(a, b, c)
названный многократно в нескольких файлах C.
Я должен найти каждое возникновение этой функции в нескольких файлах C и заменить его trial_func(a, b, c, b)
, добавление 4-го параметра со значением b
.
Параметры не то же во всех вызовах этой функции в файлах. Некоторые примеры могут быть взяты как: TRIAL_FUNC(x, sizeof(y), z)
, TRIAL_FUNC(sizeof(d), 45, e)
. Как видно, в параметрах нет того же шаблона.
Принятие файлов остается в рамках того же каталога, кто-то может помочь мне записать сценарий оболочки (удар) для достижения этой задачи?
Во-первых, учтите комментарий danzel:
Необходимо действительно использовать IDE с рефакторингом инструментов. Находящиеся в Regex замены зависят от Вашего определенного формата кода и могут легко повредиться.
После этих слов можно сделать regex замену с sed
:
sed -i.bak 's/TRIAL_FUNC(\(.*\), \(.*\), \(.*\))/trial_func\(\1, \2, \3, \2\)/' *.c
Объяснение:
-i.bak
- Отредактируйте файл "оперативные", т.е. сохраняющие изменения, но сделайте резервное копирование с .bak расширением сначалаs/x/y/
- Замена x
с y
\(\)
- Это - группа соответствия.*
- Нуль или больше символов\1
- Введите первую группу соответствия*.c
- Все.c файлы в текущем каталогеПримеры:
Вот код, который Вы упомянули:
TRIAL_FUNC(a, b, c)
TRIAL_FUNC(x, sizeof(y), z)
TRIAL_FUNC(sizeof(d), 45, e)
Вывод:
trial_func(a, b, c, b)
trial_func(x, sizeof(y), z, sizeof(y))
trial_func(sizeof(d), 45, e, 45)
И вот несовместимый код:
TRIAL_FUNC(
foo, bar, baz,
)
TRIAL_FUNC(a,b,c)
other_func(TRIAL_FUNC(a, b, c), TRIAL_FUNC(a, b, c))
Вывод:
TRIAL_FUNC(
foo, bar, baz,
)
TRIAL_FUNC(a,b,c)
other_func(trial_func(a, b, c), TRIAL_FUNC(a, b, c), b)
Вы могли записать regex, который мог составлять их, но это не стоит усилия.
Это базируется частично на ответе Kristopher, и частично на моем последнем ответе, который теперь удален.
sed -i 's/TRIAL_FUNC\(([0-9]+), ([0-9]+), ([0-9]+)\)/trial_func\(\1, \2, \3, \2\)/' *.c
sed
потоковый редактор-i
средства редактируют "на месте" - т.е. это изменит файлы непосредственно (сделайте резервное копирование сначала!)s/
означает "замену" где s/x/y/
замены весь x с y\(
используется для соответствия литералу (
так как это - специальный символ регулярного выражения([0-9]+)
используется для соответствия числу, и сохранить это - соответствие как "группа"\1
, \2
, и \3
используются для доступа к той подобранной "группе"