есть в текстовом фаиле комменты, их надо удалить.
Как это можно проще всего сделать?
Sed или как убрать лишнее в текстовом файле
Если это обычный конфигурационный файл в общем, очень упрощённом варианте, достаточно
grep -v '^[[:space:]]*#' test.txt
Если приведёте пример файла, можно говорить более предметно.
gen,
Недавняя тема: Удаление строки из файла
ммм... спасибо... изучу. но комменты сложные ,не в одну строку...
/*
* comments
*
*/такие вот
как многострочность обеспечить в sed ?
что-то в этом роде:
sed -r '/\/\*/{:com;N;s/\/\*(.*)\*\///g;T com};'
будет фейлиться, если на одной строке несколько таких комментариев...
ну и не проверяет, является ли /* частью строки...
в общем дальше предлагаю самостоятельно распарсить скрипт
ЗЫ: а вообще для того чтобы ручками делать задача достаточно геморройная...
ЗЗЫ: ещё можно что-то из gcc -E -fpreprocessed выцыганить
Fat-Zer, ну да препроцессор может удалить все комменты...
Но
1) он зачем то после обработки текста пишет нумерацию строк типа: # 51 init.c
Зачем это он делает хз.
2) не все комменты нужно удалить , только такого типа
/**
* comments
*
*/
спасибо за скрипт, изучу...
Зачем это он делает не знаю.
чтобы при скармливании этого компилятору компилятор знал, сколько строк было выкинуто, чтобы указывал ошибки на правильных местах.
/* * comments * */
ну можно либо грузить их в буфер как пишет Fat-Zer, а можно и так:
/начало/,/конец/dЭтот sed-скрипт удаляет все строки начиная со строки со словом "начало", и до строки со словом "конец" включительно. А вообще, удаление комментариев - очень сложная проблема, и просто так не решается с наскока.
Вот для bash примерчик: http://drbatty.ru/sed/ch04s11.html
Для C++ естественно это всё на порядок сложнее, и то, без препроцессора. С препроцессором так вообще нереально.
1) он зачем то после обработки текста пишет нумерацию строк типа: # 51 init.c
а вот это уже можно дочистить sed'ом.
не все комменты нужно удалить , только такого типа
/**
* comments
*
*/
Если речь только о многострочных комментах, можно с помощью простого AWK-script-a:
#!/usr/bin/gawk -f
BEGIN { iscom=1; }
/\/\*\*/ { iscom=0 } # Начало комментария (/**), блок. вывод
{ if (iscom) print $0 } # Применяется к каждой строке
/\*\// { iscom=1 } # Конец комментария (*/), вывод со след. строки
Пользоваться так:
./uncomm.sh file_in > file_in.new && mv file_in.new file_in