2012-05-11 2 views
0

Я ищу попытку вырезать комментарии C из наших файлов патчей и посмотрел на многочисленные регулярные выражения, но если мы удалим строки из наших патчей - это сломает их.Метод снятия комментариев с C из файлов исправлений

Как вы могли бы написать команду regex или sed для поиска файлов исправлений diff для комментариев и замены строк комментариев пробелами.

Это работает SED регулярных выражений работает для файлов C, но для патчей мне нужно что-то другое:

sed '/^\/\*/,/\*\//d' 

Пример патч отрывок будет:

@@ -382,7 +391,109 @@ 
     return len; 
} 

+/********************************************************************************** 
+ * Some patch 
+ * Author: Mcdoomington 
+ * Do somethimg 
+ * 
+ * fix me 
+ **********************************************************************************/ 

Кто-нибудь есть идеи?

Edit:

С помощью этого фильтра:

sed -e 's,^+ \*.*,+ \/\/Comment removed,' mypatch.patch > output 


+/********************************************************************************** 
+ //Comment removed 
+ //Comment removed 
+ //Comment removed 

Как добавить, если строка заканчивается \, чтобы пропустить его?

Edit: Решение

Хотя не самый чистый путь - я использовал СЭД с регулярным выражением присяжных оснасткой.

sed -e '/[^\*\/]$/{N;s,^+ \* .*,+ \* Comment removed,;}' patch > output 
sed -e '/[^\*\/]$/{N;s,^+\\\* .*,+ \/\* Comment removed,;}' patch > output 

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

Как это работает:

1.) Первая команда Чтобы определить, является ли это конец комментария/[^ * /] $/определяет, будет ли это /, то {N; s,^+ \ *., +/* Комментарий удален ,;} 'находит + * (что угодно) и заменяет его на * Комментарий удален.

2.) Вторая команда Чтобы определить, является ли это концом комментария/[^ * /] $/определяет, является ли оно /then {N; s,^+ \ *., +/* Комментарий удален ,;} 'находит + * (что угодно) и заменяет его на * Комментарий удален.

+0

Являются ли файлы патчей входящими или вы их генерируете? Все ли комментарии, которые вы хотите переместить, или просто блокировать комментарии между функциями? –

+0

Файлы патчей уже созданы, и я искал простой способ удалить комментарии или, по крайней мере, пропустить их. Создание новых патчей - огромная задача из-за промежуточной среды, и они составляют около 30+. – mcdoomington

+1

Существует точка, в которой регулярные выражения просто не являются умными или достаточно гибкими, чтобы делать то, что вы хотите; это один из таких случаев. Вы должны уметь распознавать символы '/ *', '* /' и '//' token и обрабатывать файл соответствующим образом. Лично я просто рубил свой собственный фильтр для такой работы; не должно занимать больше двух часов. –

ответ

1

Я просто использовал быстрый и грязный hackjob, что консервированный большинство комментариев с помощью

sed -e '/[^\*\/]$/{N;s,^+ \* .*,+ \* Comment removed,;}' patch > output 
sed -e '/[^\*\/]$/{N;s,^+\\\* .*,+ \/\* Comment removed,;}' patch > output 
1

Регулярные выражения замечательные, но не такие замечательные.

Я бы удалил комментарии перед созданием патча.

Если вы не можете этого сделать, я бы применил патч. Удалите комментарии из исправленных и нераспакованных файлов, а затем заново создайте патч.

Так, начиная с x.h мы редактируем его x1.h и создать патч:

diff -u x.h x1.h > patch 

Тогда мы публикуем патч к кому-то, кто имеет x.h.

cp x.h xnc.h 
sed -e '/^\/\*/,/\*\//d' -i xnc.h 
patch x.h patch 
cp x.h xnc2.h 
sed -e '/^\/\*/,/\*\//d' -i xnc2.h 
diff -u xnc.h xnc2.h > patchnc 

должен создать плакат без комментариев.

Но если я исправлен и неисправленных источник деревьев, то

find unpatched -exec sed -e ':^/\*:,:\*/:d' -i "{}" \; 
find patched -exec sed -e ':^/\*:,:\*/:d' -i "{}" \; 
diff -urN unpatched patched > patch 
+0

Это немного трудоемкий процесс, к сожалению, знаете ли вы, каким образом можно, по крайней мере, автоматизировать хорошую часть этого? – mcdoomington

+0

вы должны иметь возможность сценария. Почему бы не сделать это, прежде чем делать патч? – Julian

+1

@mcdoomington: вы хотите удалить все комментарии или просто те, которые появляются в патче? Что вы хотите сделать с патчем, который влияет только на часть комментария блока? Есть программы для компиляции C-комментариев (у меня есть пара, которую я написал, я не буду единственным человеком с таким), и я был бы склонен пересмотреть процесс создания патчей, чтобы старый и новый источник не имели нежелательные комментарии перед созданием патчей. –

0

я бы не использовать регулярные выражения. В целом они работают внутри линии. И ваш файл будет содержать комментарии, которые выполняются на нескольких строках.

Я бы написал простой парсер в C/C++ или Java.

Начать с состоянием 0.

В состоянии 0 просто читать посимвольно (и выводит его), пока вы не найдете последовательность/*

Затем перейти в состояние 1.

В состоянии 1 только что прочитал символ за символом (и не выводить его) до тех пор, пока не найдете последовательность */