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

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

sed '/\/\*/d' 

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

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

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

Ответ 1

Если это в файле 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", чтобы указать применяемый стандарт Си.

См. fooobar.com/questions/2310144/... для получения подробной информации.

Ответ 2

Здесь один из способов: 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

Ответ 3

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

 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 

Ответ 4

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

Ответ 5

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

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

Это начало, во всяком случае!

Ответ 6

Попробуйте это

sed "/^\//,/\/;/d" filename

Ответ 7

Решение sed -only:

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/.*// эффективно удалив все строки между шаблонами \/\* и \*\/ - это /* и */ сбежал.