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