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

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

sed '//*/d' 

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

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

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

6 ответов


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

[ $# -eq 2 ] && arg="" || 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 для применения.


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

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

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

альтернативно, вот один лайнер:

sed -r ':a; s%(.*)/\*.*\*/%%; ta; /\/\*/ !b; N; ba' file.txt

Это

 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 

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


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

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

это начало, в любом случае!


попробуй такое

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