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...@bol.com.br> > > > > > > > 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. > > > > > > > >