Solução "definitiva", um script que chamei de lsdef: http://bash.pastebin.com/f633c24c7
Exemplo: $ lsdef +c -du `find -type f -a -not -name \*~*` >full.tmp $ lsdef -i `find -type f -a -not -name \*~*` | sort -u | grep -vf full.tmp PWRDECODER ... __CONSOLE__ __WIN32__ __unix__ E assim eu posso conferir todas as opções dos meus projetos, Marcio Gil. --- Em shell-script@yahoogrupos.com.br, "Marcio Gil" <marciom...@...> escreveu > > 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 <marciom...@...> > > > > > > > > > > > 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. > > > > > > > > > > > > > >