shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [shell-script] Pesquisa de diretivas #if


From: Marcio Gil
Subject: RE: [shell-script] Pesquisa de diretivas #if
Date: Thu, 14 Jan 2010 00:22:15 -0200

Pessoal, a cinco meses eu fiz uma pergunta sobre separar diretivas
da linguagem C. O objetivo era verificar se havia alguma opção de
compilação não utilizada ou escrita incorretamente. Posto aqui a
minha solução (para o caso de alguém se beneficiar dela).

Como a pesquisa é complexa, eu criei algumas variáveis para me
permitir brincar mais facilmente:

# Remove comentários:
$ export rmcomm=':a;/\/\*\([^*]*\(\*[^/]\)*\)*$/{N;s/\n//;ba};\
s/ *\/\*\([^*]*\(\*[^/]\)*\)*\*\///g;s/ *\/\/.*$//g'

# Pesquisa e junta diretivas de múltiplas linhas em uma só:
$ export direct=':a;/^ *#.*\\$/{N;s/\\\n//;ba};/^ *# *if.*$/'

# Pesquisa e junta definições (#define):
$ export define=':a;/^ *#.*\\$/{N;s/\\\n//;ba};/^ *# *define.*$/'

# retira operadores separando as macros com um único espaço:
$ export spdirect='{s/^ *# *[a-z]* *//;\
s/ *\(defined\)\?[^A-Za-z0-9_]\+/ /g;\
s/^ \+\| \+$//g;s/ \+\([^\n]\)/ \1/g;p}'

# retira operadores separando as macros em linhas distintas:
$ export nldirect='{s/^ *# *[a-z]* *//;\
s/ *\(defined\)\?[^A-Za-z0-9_]\+/ /g;\
s/^ \+\| \+$//g;s/ \+\([^\n]\)/\n\1/g;p}'

Exemplos:

# Lista as opções definidas:
$ sed -n -e "$rmcomm" -e "$define$nldirect" config.h | sort -u |
grep "\<[A-Z][A-Z0-9_]*\>"

# Lista as opções utilizadas:
$ sed -n -e "$rmcomm" -e "$direct$nldirect" *.!(*~*) | sort -u |
grep "\<[A-Z][A-Z0-9_]*\>"

# Lista opções utilizadas e não definidas:
$ sed -n -e "$rmcomm" -e "$define$nldirect" config.h | sort -u |
grep "\<[A-Z][A-Z0-9_]*\>" >temp.lst
$ sed -n -e "$rmcomm" -e "$direct$nldirect" *.!(*~*) | sort -u |
grep "\<[A-Z][A-Z0-9_]*\>" | grep -vf temp.lst

# Lista opções definidas e não utilizadas:
$ sed -n -e "$rmcomm" -e "$direct$nldirect" *.!(*~*) | sort -u |
grep "\<[A-Z][A-Z0-9_]*\>" >temp.lst
$ sed -n -e "$rmcomm" -e "$define$nldirect" config.h | sort -u |
grep "\<[A-Z][A-Z0-9_]*\>" | grep -vf temp.lst 

Obrigado pelas dicas, aprendi muito sobre shell-script nos últimos
meses.

Márcio Gil.

> -----Original Message-----
> From: Julio C. Neves
> Sent: Wednesday, August 19, 2009 12:23 PM
> 
> OK Marcio,
> eu imaginei que vc quisesse todas as linhas, porém quebrando 
> as linhas que
> contém as diretivas. Se vc que somente esta segunda parte, faça:
> 
> $ sed -nr '/#if n?defined/p' arq1 | sed -r 's/(\|\||&&)/\\\n\1/'
> 
> -- 
> Abraços,
> Julio
> Cursos de Shell e Zenity em 2 fins de semana?
> - Em SP ligue (11) 2125-4747 (dias 29-30/08 e 12-13/09);
> - Em DF ligue (61) 3223-3000;
> - No RJ ligue (21) 2561-0867;
> - Turmas fechadas em outras cidades ligue (21) 8112-9988.
> 2009/8/19 Márcio Gil <address@hidden>
> 
> >
> >
> > Julio,
> >
> > seria interessante se eu pudesse resolver tudo em um único
comando
> > (utilizando o sed como grep), mas a linha que você me sugeriu
> > retornou todas as linhas dos arquivos, e não só as linhas com
> > diretivas...
> >
> >
> >
> > > -----Original Message-----
> > > From: Julio C. Neves
> > >
> > > Aê Marcio,
> > >
> > > método KISS:
> > >
> > > $ sed -r '/#if n?defined/s/(\|\||&&)/\\\n\1/' *.cpp
> > >
> > > Essa linha fará tudo que vc quer.
> >
> >  
> >
> 
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]