LINUX.ORG.RU

Ответ на: комментарий от as33

Да нет, тогда уж проще perl, sed или awk :)

...

Интересует, собственно, нет ли какого-нить sed, но работающего с многострочным потоком как с единым целым без ручной возни с буфером. Т.е. чтобы принял весь поток, прошёлся регекспом и выдал бы.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от annoynimous

gawk

Ах да, для обработки текстов надо использовать предназначенные для этого утилиты — awk, sed, perl, а не выдумывать велосипеды на баше

annoynimous ★★★★★
()
Ответ на: комментарий от as33

Только помнить, что бывают однострочные комменты и сразу проверять строку на */

as33 ★☆☆
()

gcc -E -fpreprocessed?

       -fpreprocessed
           Indicate to the preprocessor that the input file has already been preprocessed.  This suppresses things like macro expansion, tri-
           graph conversion, escaped newline splicing, and processing of most directives.  The preprocessor still recognizes and removes com-
           ments, so that you can pass a file preprocessed with -C to the compiler without problems.  In this mode the integrated preprocessor
           is little more than a tokenizer for the front ends.
linuxfan
()
Ответ на: комментарий от annoynimous

>а не выдумывать велосипеды на баше

Именно утилита в духе перечисленных и интересует. Но более удобная для этой цели.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от linuxfan

Мне это не [только] для Си нужно. Именно поэтому «Си-подобные». Например, именно сейчас интересует очистка от комментариев CSS'ов. А то yuicompressor на некоторых комментариях теряет башню.

KRoN73 ★★★★★
() автор топика

flex, bison. Пишется твоя утилита за пять минут. Сейчас гляну может где и завалялась реализация…

KblCb ★★★★★
()
Ответ на: комментарий от KRoN73

gcc -E -xc -fpreprocessed Он же в этом режиме только комментарии вырезает.

linuxfan
()
Ответ на: комментарий от KblCb

>flex, bison

bison тут лишний, но 5 минут легко и непринужденно превращаются в час, стоит только вспомнить о строках, внутри которых «/**/» не являются комментариями.

linuxfan
()
Ответ на: комментарий от KRoN73

так я привел решение. Вот выдержка из мана

The pattern1, pattern2 form of an expression is called a range pattern. It matches all input records starting with a record that matches pattern1, and continuing until a record that matches pattern2, inclusive. It does not combine with any other sort of pattern expression.

annoynimous ★★★★★
()
Ответ на: комментарий от KRoN73

> Интересует, собственно, нет ли какого-нить sed, но работающего с многострочным потоком как с единым целым без ручной возни с буфером.

Костыль:

cat file.c | tr '\n' '#' | sed ??? | tr '#' '\n'

:)

annoynimous ★★★★★
()
Ответ на: комментарий от linuxfan

Про строки забыл. Но в C подобных языках строковые литералы вроде бы всегда объявляются в кавычках, то есть вместо одного правила у нас два. Нет?

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

У нас три контекста: общий, «строка» и «комментарий». В общем контексте символы '«' и »/*" трактуются как начала строки и комментария, соотвественно, в контексте строки разрешены '\«', в контексте комментария '»' уже не будет открывать строковой контекст. В общем, это все тянет на «больше, чем 5 минут».

linuxfan
()
Ответ на: комментарий от megabaks

Ага, нафиг их! :)

Заменитель можно выбрать по вкусу, предварительно проверив, что он в файле не встречается

annoynimous ★★★★★
()
Ответ на: комментарий от linuxfan

> В общем, это все тянет на «больше, чем 5 минут».

Угу, на 6. Ещё один контекст добавить.

kemm
()
Ответ на: комментарий от linuxfan

>В общем, это все тянет на «больше, чем 5 минут».

10 часов, если по Правилу Вестгеймера.

KRoN73 ★★★★★
() автор топика

С помощью sgrep в одну строку можно наверное :)

Nao ★★★★★
()

sgrep 'start .. end extracting («/*»..«*/»)' xts.c

Только там на месте многострочных комментариев остаётся пустая строка. Как-то наверное можно сделать чтобы она удалялась, но я хз.

Nao ★★★★★
()
Ответ на: комментарий от linuxfan

> стоит только вспомнить о строках, внутри которых «/**/» не являются комментариями.

Не выдумывайте, пишется на с за 40 минут.

gena2x ★★★
()

как-то так - sed '/\/\*/,/\*\//d' file.name

ananas ★★★★★
()
Ответ на: комментарий от linuxfan

В общем, это все тянет на «больше, чем 5 минут».

И опять epic fail? 8))

$ time vim t.l

real    3m15.177s
user    0m0.271s
sys     0m0.029s
$ cat t.l
%{
#include <stdio.h>
%}

%option noyywrap
%x COMMENT
%x STRING

%%
"/*"            { BEGIN(COMMENT); }

<COMMENT>"*/"   { BEGIN(INITIAL); }

<COMMENT>.      /* noop */

\"              { BEGIN(STRING); printf("\""); }
<STRING>"\\\""  { printf("\\\""); }
<STRING>\"      { BEGIN(INITIAL); printf("\""); }
<STRING>.       { printf("%s", yytext); }

%%

int
main()
{
        yyin = stdin;
        yylex();

        return 0;
}
kemm
()

Линус, ты?

anonymous
()
Ответ на: комментарий от linuxfan

> Не вижу здесь вывода time info flex

А с чего он там должен быть? Любой инструмент предполагает умение им пользховаться. Впрочем, как бы ты мог догадаться, info flex был в _это_ _же_ _самое_ _время_ открыт в другом табе konsole.

kemm
()
Ответ на: комментарий от kemm

>Любой инструмент предполагает умение им пользховаться.

Умение пользоваться инструментом является результатом круения манов, а не божественным даром, ниспосланным свыше. В мой час входило в том числе и раскуривание крепкой GNUтой дури из info flex.

linuxfan
()
Ответ на: комментарий от linuxfan

> В мой час входило в том числе и раскуривание крепкой GNUтой дури из info flex.

Вычти обратно. Потому что тогда любое решение потребует как минимум не меньше - info gcc чтение не менее забористое, про man perl (и далее по списку) или man sed/grep/awk/bash я совсем молчу.

kemm
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.