Найдите и замените имя функции и также отредактируйте его параметры

У меня есть функция 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). Как видно, в параметрах нет того же шаблона.

Принятие файлов остается в рамках того же каталога, кто-то может помочь мне записать сценарий оболочки (удар) для достижения этой задачи?

-3
задан 2 February 2019 в 17:16

2 ответа

Во-первых, учтите комментарий 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, и частично на моем последнем ответе, который теперь удален.

0
ответ дан 26 October 2019 в 10:00
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 используются для доступа к той подобранной "группе"
1
ответ дан 26 October 2019 в 10:00

Другие вопросы по тегам:

Похожие вопросы: