LinuxForum.Fans
Тема

Sed или как убрать лишнее в текстовом файле

Автор: gen 10 сообщений 3210 просмотров
#242345

есть в текстовом фаиле комменты, их надо удалить.
Как это можно проще всего сделать?

#242360

Если это обычный конфигурационный файл в общем, очень упрощённом варианте, достаточно

text

grep -v '^[[:space:]]*#' test.txt 

Если приведёте пример файла, можно говорить более предметно.

#242373

ммм... спасибо... изучу. но комменты сложные ,не в одну строку...

text
/*
* comments
*
*/

такие вот

#242610

как многострочность обеспечить в sed ?

#242613

что-то в этом роде:
sed -r '/\/\*/{:com;N;s/\/\*(.*)\*\///g;T com};'
будет фейлиться, если на одной строке несколько таких комментариев...
ну и не проверяет, является ли /* частью строки...

в общем дальше предлагаю самостоятельно распарсить скрипт
ЗЫ: а вообще для того чтобы ручками делать задача достаточно геморройная...
ЗЗЫ: ещё можно что-то из gcc -E -fpreprocessed выцыганить

#242622

Fat-Zer, ну да препроцессор может удалить все комменты...
Но
1) он зачем то после обработки текста пишет нумерацию строк типа: # 51 init.c

Зачем это он делает хз.

2) не все комменты нужно удалить , только такого типа
/**
* comments
*
*/

спасибо за скрипт, изучу...

#242625
"gen" написал:
Зачем это он делает не знаю.

чтобы при скармливании этого компилятору компилятор знал, сколько строк было выкинуто, чтобы указывал ошибки на правильных местах.

#243076
"gen" написал:
/* * comments * */

ну можно либо грузить их в буфер как пишет Fat-Zer, а можно и так:

text
/начало/,/конец/d

Этот sed-скрипт удаляет все строки начиная со строки со словом "начало", и до строки со словом "конец" включительно. А вообще, удаление комментариев - очень сложная проблема, и просто так не решается с наскока.
Вот для bash примерчик: http://drbatty.ru/sed/ch04s11.html
Для C++ естественно это всё на порядок сложнее, и то, без препроцессора. С препроцессором так вообще нереально.

"gen" написал:
1) он зачем то после обработки текста пишет нумерацию строк типа: # 51 init.c

а вот это уже можно дочистить sed'ом.

#243404
gen написал:
не все комменты нужно удалить , только такого типа
/**
* comments
*
*/

Если речь только о многострочных комментах, можно с помощью простого AWK-script-a:

text

#!/usr/bin/gawk -f

BEGIN { iscom=1; }

/\/\*\*/ { iscom=0 } # Начало комментария (/**), блок. вывод

{ if (iscom) print $0 } # Применяется к каждой строке

/\*\// { iscom=1 } # Конец комментария (*/), вывод со след. строки

Пользоваться так:

text

./uncomm.sh file_in > file_in.new && mv file_in.new file_in
Войдите или зарегистрируйтесь, чтобы ответить.