Удалить многострочные комментарии

Как мне удалить все комментарии, если они начинаются с / * и заканчиваются * / Я пробовал следующее. Это работает для однострочного комментария.

sed '/\/\*/d' 

Но это не удаляет многострочные комментарии. например, вторая и третья строки не удаляются.

/*!50500 PARTITION BY RANGE (TO_SECONDS(date_time ))
 PARTITION 20120102parti VALUES LESS THAN (63492681600),
(PARTITION 20120101parti VALUES LESS THAN (63492595200) */ ;

В приведенном выше примере мне нужносохранить последнее; после заключительного комментария

 Vijay25 окт. 2012 г., 07:53
 shantanuo25 окт. 2012 г., 07:21
# awk '/ * /, / * \ //» # вернет все комментарии. Мне нужен текст кроме комментариев
 Ed Morton25 окт. 2012 г., 08:29
Вам нужно больше, чем CPP. Смотрите обсуждение, на которое вы ссылались, и мой ответ здесь (и там сейчас!).
 Vijay25 окт. 2012 г., 07:54
Если вы имеете в виду исходный файл c, то.cpp -P your_cpp_file

Ответы на вопрос(7)

sed-только решение:

sed -r 's/\/\*(.*?)\*\///g' \
    | sed -r 's/(.+)(\/\*)/\1\n\2/g'\
    | sed -r 's/(\*\/)(.+)/\1\n\2/g' \
    | sed '/\/\*/,/\*\// s/.*//'

Недостатки: многострочные комментарии оставят пустые строки (потому что sed основывается на строках, если вы не приложите сверхчеловеческих усилий).

объяснение

s/\/\*(.*?)\*\///g позаботится об однострочных комментариях.s/(.+)(\/\*)/\1\n\2/g а такжеs/(\*\/)(.+)/\1\n\2/g будет разбивать строки в начале и в конце многострочных комментариев./\/\*/,/\*\// s/.*// будет запускать командуs/.*// эффективно удаляя все линии между шаблонами\/\* а также\*\/ - который/* а также*/ убежали.

Это должно сделать

 sed 's|/\*|\n&|g;s|*/|&\n|g' a.txt | sed '/\/\*/,/*\//d'

Для теста:

a.txt

/* Line test
multi
comment */
Hello there
this would stay 
/* this would be deleteed */

Команда:»

$ sed 's|/\*|\n&|g;s|*/|&\n|g' a.txt | sed '/\/\*/,/*\//d'
Hello there
this would stay 
 Anshu25 окт. 2012 г., 07:07
да, это требует некоторой работы, будет работать нормально, если у вас есть только один комментарий сверху, возможно, вы можете использовать в качестве отправной точки
 shantanuo25 окт. 2012 г., 07:03
останься снова не осталось :) и точка с запятой после комментария * /

Вот'один способ использованияGNU sed, Беги какsed -rf script.sed file.txt

Содержание:script.sed

:a
s%(.*)/\*.*\*/%\1%
ta
/\/\*/ !b
N
ba

В качестве альтернативы здесьодин лайнер:

sed -r ':a; s%(.*)/\*.*\*/%\1%; ta; /\/\*/ !b; N; ba' file.txt
 martinkunev28 мар. 2017 г., 15:49
У меня та же проблема, что и у shantanuo с sed 4.2.2
 shantanuo25 окт. 2012 г., 07:55
Работает на 2 или 3 строки комментариев. К сожалению, у меня есть тысячи строк в качестве комментария, и это, похоже, не завершает работу.
 Arun30 окт. 2018 г., 05:29
Заставляет sed идти в неопределенный цикл.github.com/jacob-carlborg/dstep/files/2527976/test.txt
 shantanuo25 окт. 2012 г., 08:16
Он потребляет 99% процессора, и сервер не отвечает в течение длительного времени. Я должен убить процесс, используя Ctrl + C
 MetalGodwin15 сент. 2018 г., 00:41
По какой-то причине не работает при непосредственном манипулировании файлом с помощью sed (sed -i). В противном случае это работает хорошо, спасибо! // sed (GNU sed) 4.4
 Guru25 окт. 2012 г., 07:33
+1. слишком хорошо........
 martinkunev28 мар. 2017 г., 16:11
@EdMorton Спасибо, я просто искал быстрое решение и нена самом деле не думаю, что sed не может работать. Мне просто пришло в голову, что люди обычно забывают о триграфах. Теперь, когда яЯ думаю о вашем комментарии, очевидно, все это имеет смысл. Я закончил тем, что использовал ваше решение :)
 Steve30 окт. 2018 г., 07:52
@Arun: похоже на тебяпонадобитсяC локаль для этого: .LC_ALL=C sed -r '...' file
 shantanuo25 окт. 2012 г., 09:09
GNU sed версия 4.1.5
 Ed Morton28 мар. 2017 г., 16:15
@martinkunev Где-то в сети естьмассивный Сценарий Sed (я думаю, что это один из IIRC:sed.sourceforge.net/grabbag/scripts/remccoms3.sed), который пытается выполнить эту работу, и несколько лет назад, когда я указал на случай, когда автор потерпел неудачу, и я прошел через многократные итерации своего указания на случаи, когда он потерпел неудачу, и он наложил на сценарий бинты, пока мы оба не устали , Единственный способ этоя бы работал, если бы вы могли написать надежный C-парсер в sed и дажеЕСЛИ это было возможно, я могуне представляю себе более бессмысленный способ провести время, чем пытаться это сделать!
 Steve25 окт. 2012 г., 08:07
@shantanuo: это хорошо работает для меня. Что вы подразумеваете под 'не похоже, чтобы завершить работу "?
 Ed Morton28 мар. 2017 г., 15:58
@martinkunev Это и все другие решения sed потерпят неудачу, учитывая различные входные значения, например, могутт различить/* как начало комментария против/* внутри комментария против/* внутри строки и т. д. И это 'даже не принимая во внимание триграфы :-). Вот почему вам нужно использовать инструмент, который понимает язык, какcpp или жеgcc -E если это C или C ++.

Попробуй это

sed "/^\//,/\/;/d" filename
Решение Вопроса

Если это в файле C, то вы ДОЛЖНЫ использовать препроцессор C для этого в сочетании с другими инструментами, чтобы временно отключить определенные функции препроцессора, такие как расширение #defines или #include, все остальные подходы в крайних случаях потерпят неудачу. Это будет работать для всех случаев:

[ $# -eq 2 ] && arg="$1" || arg=""
eval file="\$#"
sed 's/a/aA/g;s/__/aB/g;s/#/aC/g' "$file" |
          gcc -P -E $arg - |
          sed 's/aC/#/g;s/aB/__/g;s/aA/a/g'

Поместите его в сценарий оболочки и назовите его с именем файла, который вы хотите проанализировать, опционально с префиксом типа "-ansi» указать применяемый стандарт С

Дополнить ЭдьВ ответе (сфокусированном на C-файлах) я бы предложил отличный сценарий sed remccoms3.sed Брайана Хайлса для не-C-файлов (например, PL / SQL-файл). Он обрабатывает комментарии C и C ++ (//) и корректно пропускает комментарии внутри строк. Сценарий доступен здесь:http://sed.sourceforge.net/grabbag/scripts/remccoms3.sed

 Ed Morton09 апр. 2019 г., 04:55
IIRC Брайан и я некоторое время изучали этот сценарий, может быть, лет 15 назад, в сети Usenet. Я продолжал демонстрировать случаи, когда это терпело неудачу, он продолжал исправлять их, пока я не сыт по горло, делая это, поскольку не было конца в поле зрения Я бы нене доверяю, чтобы быть надежным в целом (и яу нас нет причин использовать его, поскольку вы можете делать работу кратко и надежно с помощью gcc), но в то время мы обсуждали C и C ++, так что это может быть просто замечательно для файлов, не упомянутых в C, и этоСкорее всего, это нормально для большинства файлов C и C ++.

Это может работать для вас (GNU sed):

sed -r ':a;$!{N;ba};s|/\*[^*]*\*+([^/*][^*]*\*+)*/||' file

Это'В любом случае, это начало!

Ваш ответ на вопрос