Portál AbcLinuxu, 18. dubna 2024 14:12


Dotaz: Sed či Awk script na odstranění C komentářů

7.7.2005 02:12 © | skóre: 37 | blog: escaped
Sed či Awk script na odstranění C komentářů
Přečteno: 253×
Odpovědět | Admin
Dobrý den,

při veškeré snaze co mám se mi nedaří napsat regulární výraz na odstranění jakoby C komentářů.

Vzorek:
---cut---
// toto nezustane
toto zustane 1
toto zustane 2 // toto nezustane
toto zustane 3
/*
toto nezustane
*/
toto zustane 4
toto zustane 5 /* toto nezustane
toto nezustane
*/
toto zustane 6
toto zustane 7 /* toto nezustane */
toto zustane 8
/* toto nezustane */ toto zustane 9
/*
toto nezustane */ toto zustane 10
--cut---
Pokud komentář zabírá celý samostatný řádek nebo nějaká jeho část zabírá celý samostatný řádek, měl by být tento řádek zcela vymazán (např. 3 zakomentované řádky za "toto zustane" č. 3 z uvedeného vzorku by tedy zcela zmizely).

Pokud komentář začíná na konci řádku (viz "toto zustane" 2, 5, 7, 9 ve vzorku), měl by být odmazán a odmazány by měly být všechny zbylé mezery či tabulátory na konci takového řádku.

Pokud je komentář na začátku a následuje za ním další kód (viz. "toto zustane" 9 a 10 ve vzorku), měl by být kromě komentáře samotného odmazány i všechny mezery či tabulátory před kódem tak, aby se ocitl na začátku řádku.

Výstupem scriptu spuštěného na uvedený vzorek by jednoduše mělo být:
---cut---
toto zustane 1
toto zustane 2
toto zustane 3
toto zustane 4
toto zustane 5
toto zustane 6
toto zustane 7
toto zustane 8
toto zustane 9
toto zustane 10
---cut---
Vím, že je to poměrně složité (ostatně, kdyby to bylo jednoduché, neptal bych se zde).

PS: Ujišťuji vás, že rozhodně nejde o žádný DÚ, jak je tu dobrým zvykem se domnívat. Opravdu to potřebuji k reálné věci. Nástroje Sed a Awk musí být použity proto, že script, do něhož to potřebuji, poběží na stroji s nainstalovaným základním systémem bez Perlu či podobných nástrojů.

Děkuji za pomoc.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.7.2005 02:23 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
Rozbalit Rozbalit vše Re: Sed či Awk script na odstranění C komentářů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Už jsem tohle taky jednou psal a nikdy jsem to nedokopal do rozumného stádia :-) ... Nakonec jsem použil nějaký program, teď jsem našel mangle, ale nevím jestli to je ono.
Weblate - překládání přes web | Gammu SMSD - posílání SMS | Blog
7.7.2005 02:45 © | skóre: 37 | blog: escaped
Rozbalit Rozbalit vše Re: Sed či Awk script na odstranění C komentářů
Problém je, že já to potřebuji v Sedu nebo v Awku (Gawku). Každopádně tu ten odkaz nalezne třeba někdo jiný, komu by se to hodilo.
7.7.2005 02:43 8an | skóre: 30
Rozbalit Rozbalit vše Re: Sed či Awk script na odstranění C komentářů
Odpovědět | | Sbalit | Link | Blokovat | Admin
sed '/^ *\/\//d;s/ *\/\/.*//;:1;/^ *\/\*.*\*\/ *$/d;s/ *\/\*.*\*\/ *//;/\/\*/N;/\/\*/b1;'

Zjištění jak to funguje ponechávám jako těžší cvičení pro čtenáře :-D
If you build an operating system that even an idiot can use, only idiots will use it.
7.7.2005 02:47 © | skóre: 37 | blog: escaped
Rozbalit Rozbalit vše Re: Sed či Awk script na odstranění C komentářů
To je naprosto dokonalé. Děkuji! Prostuduji si to.
7.7.2005 03:05 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
Rozbalit Rozbalit vše Re: Sed či Awk script na odstranění C komentářů
A zjištění, že to nefunguje taky? :-)
$ cat head.c 
/*
 * komentar
 */

$ sed '/^ *\/\//d;s/ *\/\/.*//;:1;/^ \/\.*\*\/ *$/d;s/ \/\.*\*\/ *//;/\/\*/N;/\/\*/b1;' head.c 
/*
 * komentar
 */

7.7.2005 07:46 © | skóre: 37 | blog: escaped
Rozbalit Rozbalit vše Re: Sed či Awk script na odstranění C komentářů
Vidíte, na tento případ jsem ve vzorku zapoměl. :-(
7.7.2005 08:05 © | skóre: 37 | blog: escaped
Rozbalit Rozbalit vše Re: Sed či Awk script na odstranění C komentářů
Mě to tedy funguje (máte to blbě opsané):
sed '/^ *\/\//d;s/ *\/\/.*//;:1;/^ *\/\*.*\*\/ *$/d;s/ *\/\*.*\*\/ *//;/\/\*/N;/\/\*/b1;' test
cat test
// toto nezustane
toto zustane 1
toto zustane 2 // toto nezustane
toto zustane 3
/*
toto nezustane
*/
toto zustane 4
toto zustane 5 /* toto nezustane
toto nezustane
*/
toto zustane 6
toto zustane 7 /* toto nezustane */
toto zustane 8
/* toto nezustane */ toto zustane 9
/*
toto nezustane */ toto zustane 10
/*
 * toto nezustane
 */ toto zustane 11
toto zustane 12
toto zustane 13 /*
    * toto nezustane
    */
/*
 * toto nezustane
 */
toto zustane 14
7.7.2005 09:32 Matouš Jan Fialka
Rozbalit Rozbalit vše Re: Sed či Awk script na odstranění C komentářů
Přesto jsem jednu chybičku našel:
/*
 * toto nezustane
 */     toto zustane
kde bílé místo za koncem komentáře sestává i z tabulátoru a zůstane, což plně nevyhovuje podmínkám toho původního zadání.

Takže malá úprava by mohla být takováto (raději to někdo po mě projeďte, ale jen jsem přidal místo mezery [ \t]):
sed '/^ *\/\//d;s/ *\/\/.*//;:1;/^ *\/\*.*\*\/ *$/d;s/ *\/\*.*\*\/[ \t]*//;/\/\*/N;/\/\*/b1;'
7.7.2005 12:54 8an | skóre: 30
Rozbalit Rozbalit vše Re: Sed či Awk script na odstranění C komentářů
Místo všech mezer je potřeba dát [ \t], neboli sed 's/ /[ \\t]/g'.

sed '/^[ \t]*\/\//d;s/[ \t]*\/\/.*//;:1;/^[ \t]*\/\*.*\*\/[ \t]*$/d;s/[ \t]*\/\*.*\*\/[ \t]*//;/\/\*/N;/\/\*/b1;'
If you build an operating system that even an idiot can use, only idiots will use it.
7.7.2005 09:42 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Sed či Awk script na odstranění C komentářů
Trochu kratší:
sed -ne 'H;${x;s://[^\n]*::g;s:/\*\([^*]*\(\*[^/]\)\?\)*\*/::g;p}
Škoda, že ani gnu sed neumí *?, pak by to bylo úplně triviální.
7.7.2005 09:44 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Sed či Awk script na odstranění C komentářů
Jo sorry, tohle neodmazává ty mezery.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.