Я хотел удалить макрос в одном из проектов, над которым работал, и для этого потребовался скрипт, так как в исходном коде c / cpp есть более 800 вхождений.Обратите внимание, что хотя этот макрос присутствует в файлах cpp, все объявления и типы являются простыми c.
Рассматриваемый макрос выглядит так:
#define ARRAY(data_type, size, array_name) data_type array_name[size]
Когда он используется в источнике, он выглядитвот так:
#define BAR_LEN 2
struct Foo_t
{
uint16_t example;
ARRAY(uint8_t, BAR_LEN, Bar); //<-- This line
uint8_t target;
};
Теперь я могу перечислить все исходные файлы
find . -regextype egrep -regex '.*/.*\.(h|c|cpp)' -print0
и потенциально передать их в xargs для использования с другой утилитой, такой как awk или sed.Проблема в том, что я не уверен, какое направление выбрать.Используя приведенный выше пример, моя цель - преобразовать:
struct Foo_t
{
uint16_t example;
ARRAY(uint8_t, BAR_LEN, Bar); //<-- This line
uint8_t target;
};
в
struct Foo_t
{
uint16_t example;
uint8_t Bar[BAR_LEN]; //<-- This line
uint8_t target;
};
Однако существует много объявлений, в которых используется этот макрос, которые передают разные параметры для каждого вызова.Кроме того, использование макроса имеет различия в форматировании с точки зрения расстояния.Я немного озадачен на данный момент, любое направление будет с благодарностью.Спасибо!
Обновление:
В целях тестирования я создал файл Test.txt для проверки команд, все, что он содержит, - это следующие 4 строки:
ARRAY( uint8_t, 16, Bar1);
ARRAY(uint8_t,4,Bar2);
ARRAY(uint8_t, 18,Bar3);
ARRAY(uint8_t,2, Bar4);
Фактическое использование можно найти по ссылке ниже:
https://onlinegdb.com/Skpstxn1N