Удалить многострочные комментарии
Как удалить все комментарии, если они начинаются с /* и заканчиваются */ Я попробовал следующее. Он работает для одной строки комментария.
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
это начало, в любом случае!