Newsgroup: it.comp.os.linux.iniziare
Titolo: Problema con regexp di awk

Ciau,
stavo cercando di scrivere un semplice script awk per stampare i
commenti in un file .c, ed ho un dubbio: so che č possibile inserire un
OR in una regexp con |, ma si puň fare un END tra condizioni?
Ad esempio, volendo fare il matching delle righe che contengono l'inizio
di un commento multi-linea ("/*") ma non la fine ("*/") o viceversa,
senza dover fare un ulteriore testing come invece ho fatto qui sotto:
/\/\*/ { # comment start
    if($0 !~ /\*\//) {
        i=1
        while($i !~ /\/\*/)
            i++
        printf "commento riga " NR ": "
        for(j=i+1; j<=NF; j++)
            printf $j " "
        print ""
    }
}
/\*\// { # comment end
    if($0 !~ /\/\*/) {
        printf "commento riga " NR " (cont.): "
        for(i=1; i<=NF && $i !~ /\*\//; i++)
            printf $i " "
        print ""
    }
}
grazie :)
-- 
"I am not out to destroy Microsoft, that would be a completely
unintended side effect."    -- Linus Torvalds
~> 
http://www.wysinnwyg.com/

 }
pero' occhio perche' mi pare che il programma che hai postato non faccia
quello che vuoi tu (come ho detto, non   e' proprio una cosa
semplicissima). 

 semplicissima). 
Sì, quello che ho postato era solo una piccola parte dello script...
quello che ho fatto finora è così:
#!/bin/awk
# stampa commenti di file C con num. riga
$0 !~ /\*\// {
    if(flag==1)
        print "commento riga " NR " (cont.): " $0
}
/\/\// { # "//" comment
    while($i !~ /\/\//)
        i++
    printf "commento riga " NR ": "
    for(j=i+1; j<=NF; j++)
        printf $j " "
    print ""
}
/\/\*.*\// { # "/* */" comment on a single line
    i=1
    while($i !~ /\/\*/)
        i++
    printf "commento riga " NR ": "
    for(j=i+1; $j !~ /\*\// && j<NF; j++)
        printf $j " "
    print ""
}
/\/\*/ && !/\*\// { # comment start
        i=1
        while($i !~ /\/\*/)
            i++
        printf "commento riga " NR ": "
        for(j=i+1; j<=NF; j++)
            printf $j " "
        print ""
        flag=1
}
/\*\// && !/\/\*/ { # comment end
        printf "commento riga " NR " (cont.): "
        for(i=1; $i !~ /\*\// && i<=NF; i++)
            printf $i " "
        print ""
        flag=0
}
e comunque resta molto semplificato, non gestisce bene i casi in cui
"//", "/*" e "*/" non sono separati da spazi dal resto del codice. Mi
serviva solo per fare un po' di pratica con awk e le regexp :)
-- 
"Remember, the problem is not that people are stupid;
the problem is that modems are cheap."  -- Vince Sabio
~> 
http://www.wysinnwyg.com/

 serviva solo per fare un po' di pratica con awk e le regexp :)
Una cosa in cui molti o tutti i metodi basati su espressioni regolari hanno
difficolta' e' questa (tra le tante):
printf("i commenti sono /* come questo */");
Se vuoi farti un'idea di cosa puo' diventare riconoscere i commenti C con
awk, e delle difficolta' e dei casi speciali (ma validi) da gestire, leggi
questo thread:
http://tinyurl.com/6yfy93
PS: se i commenti non sono particolarmente complessi e non presentano falsi
positivi come quello sopra (o altri), un trucco e' usare (con gawk)
gawk -v RS='/\\*|\\*/' 'NR%2==0{print "/*" $0 RT}' file.c