Удаление (некоторых) комментариев из программы на C

Обратите внимание, что это загорится, если какое-либо из имен файлов содержит ,или /в них:

$ awk -F "[/,]" -v OFS="," 'BEGIN { print "LB", "-PROJ--", "FILENAME----", "USER--", "DATA-----", "TIME---", "STATUS" }NR!=1{print $4,$5,$7,$8,$9"/"$10"/"$11,$12,$13}' input
LB,-PROJ--,FILENAME----,USER--,DATA-----,TIME---,STATUS
app,app_pit,HUB_TEST.apx,uJones,4/24/2018,5:55:58,OK
app,app_pit,test_acqit1.apx,uSmith,3/8/2018,10:16:41,OK
app,app_pit,test_bkfs.apx,uHarry,/26/2018,9:47:03,OK
0
18.06.2019, 08:12
4 ответа

Проверено с помощью команды sed, все работает нормально

команда:

  sed -r "s/^\s+//g" filename| sed '/^\/\*.*\*\/$/d'

выход:

printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
/* Comment 5 */ y = 0;
/*
* Comment 6
*/
// Comment 7
0
28.01.2020, 02:30

Этот sedпереносной:

sed '\_^[[:blank:]]*/\*.*\*/[[:blank:]]*$_d' file.c

Все строки, которые начинаются(^)с нуля или более пробелов ([[:blank:]]*), начинают комментарий (/\*), имеют что-либо еще, (.*), закрывают комментарий(\*/)и не содержат ничего, кроме пробелов в остальной части строки. строка([[:blank:]]*)будет dудалена. Конечно, вы также можете сделать это с помощью grep -v.

Имейте в виду, что это также приведет к удалению таких строк, как

/* between two comments */ x = 0; /* could be some code */
1
28.01.2020, 02:30

Это то же самое, что ответ Филиппа , за исключением

  • В качестве разделителя регулярного выражения используется |(мое личное предпочтение ).
  • Вместо [[:blank:]]используется [[:space:]]. [[:space:]]включает такие не-графические символы, как вертикальная табуляция, перевод страницы и возврат каретки (в дополнение к пробелу и табуляции ); поскольку C рассматривает все эти пробельные символы как пробелы, [[:space:]]действительно лучший класс символов для использования для обработки кода C. И
  • Он обрабатывает крайний случай нескольких комментариев в одной строке.

sed '\|^[[:space:]]*/\*.*\*/[[:space:]]*$| { \|\*/.*[^[:space:]]|!d }'

Как и в ответе Филиппоса, он проверяет если первая не-пустая вещь в строке /*и последнее не-пустое значение в строке — */. Если это правда, у нас есть возможный полный -строковый комментарий; кандидат на удаление. В этом случае введите {}. и найдите */, за которым следует что-то не пустое -; т. е. */, это не последняя не -пустая вещь в строке. Если мы это найдем, тогда мы знаем, что нашли конец первого комментария, и что на линии есть что-то еще. В таком случае ничего не делайте. Если мыне найдем*/внутри линии, затем удалите строку.

1
28.01.2020, 02:30

Это должно выйти за рамки вопроса code, заключенного в квадратные скобки между комментариями

.
sed  -E '/^\s*\/\*/!bx ; /\*\/\s*$/!bx ; /\*\/\s*\S+.*\/\*/bx ; d;  :x' draft 

Если строка не начинается с маркера комментария, начинающегося только с пробела, тогда она начинается с кода, поэтому bранжируется после удаления dдоx

/^\s*\/\*/!bx    

Если строка, начинающаяся с комментария, не заканчивается комментарием, за которым следует только пробел, то в конце есть код, поэтому bранжируется после удаления dдоx

/\*\/\s*$/!bx

Эти первые два теста могут быть объединены как

/^\s*\/\*.*\*\/\s*$/!bx

Если строка комментария содержит закрывающий маркер комментария, за которым следует хотя бы один символ пробела, отличный от -, а затем начинается еще один комментарий, то внутри есть код, поэтому bранжируется после delete доx

/\*\/\s*\S+.*\/\*/bx

Поскольку мы не нашли действительного кода, удалите

d

В противном случае закончить ничего не делая

x

Проверено на

/* Comment 1 */
printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
            /* Comment 4 */
/* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7
/* between two comments */ x = 0;  /*some code */

Выход

printf("It is /* Comment 2 */\n");
x = 5; /* Comment 3 */
/* Comment 5 */ y = 0;
            /*
             * Comment 6
             */
            // Comment 7
/* between two comments */ x = 0; /*some code */
0
28.01.2020, 02:30

Теги

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