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

Re: [Off} Aumentar a precisão de diff



Ronaldo Reis Junior escreveu:
vou tentar explicar melhor. Os dois são completamente diferentes, mas eu quero um terceiro arquivo com algumas linhas do primeiro e outra linhas do segundo, sacou?

Exemplo prático.

Eu modifico algumas entradas num arquivo de configuração, exemplo:

/etc/R/ldpaths

ao atualizar o R ele pede para re-instalar o arquivo pois há modificações. eu re-instalo e ele cria um /etc/R/ldpaths.dpkg-old, mas eu quero colocar novamente minhas configs sem com isto apagar as modificações realizadas pelo mantenedor do pacote. Obviamente eu poderia simplismente fazer isto manualmente, mas gostaria de saber como fazer isto usando alguma ferramenta de diff. Eu tentei com o kompare que me permite selecionar quais modificações eu quero que seja aplicada e ignorar outras. O problema é que ele trabalha com blocos de diferenças, assim eu fico com uma situação como a descrita acima.

/etc/R/ldpaths
: ${JAVA_HOME=}
: ${R_JAVA_LD_LIBRARY_PATH=}
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib:/usr/X11R6/lib}

/etc/R/ldpaths.dpkg-old
: ${JAVA_HOME=/usr/lib/jvm/java-6-sun}
: ${R_JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/jre/lib/i386/client:
${JAVA_HOME}/jre/lib/i386:${JAVA_HOME}/jre/../lib/i386}
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib}

mas o que eu quero é fazer assim:
: ${JAVA_HOME=/usr/lib/jvm/java-6-sun}
: ${R_JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/jre/lib/i386/client:
${JAVA_HOME}/jre/lib/i386:${JAVA_HOME}/jre/../lib/i386}
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib:/usr/X11R6/lib}

Viu, algumas coisas são modificadas (linhas 1 e 2 sem quebra de linha do e-mail) e outras devem ser ignoradas (linha 3), mas o kompare só reconhece o bloco, então só consigo fazer o arquivo ldpaths ficar igual ao ldpaths.dpkg-old ou vice versa.

Entenderam?

Olá,

Agora melhorou, pode fazer o seguinte, percorrer linha a linha o arquivo atualizado e pegar apenas o que tiver até o primeiro '='; daí mostra a linha do antigo e a linha do atualizado e pergunta qual linha quer conservar, colocando essa linha escolhida no arquivo final; se a linha não tiver '=' ou não constar no arquivo antigo, essa vai para o arquivo final. Vou tentar rapidinho (sem testar):

ATUALIZADO=/etc/R/ldpaths
VELHO=/etc/R/ldpaths.dpkg-old
FINAL=/etc/R/ldpaths.final

> $FINAL

cat $ATUALIZADO | while read linha; do
   variavel="${linha%%=*}"
   if [ "$variavel" == "$linha" ]; then
       echo "$linha" >> $FINAL
   else
       valor_antigo="`grep "$variavel" $VELHO`"
       if [ "$valor_antigo" == "" ]; then
           echo "$linha" >> $FINAL
       else
           resposta="X"
while [ "$resposta" != "S" ] && [ "$resposta" != "s" ] && [ "$resposta" != "N" ] && [ "$resposta" != "n" ]; do
               echo
               echo "Novo : $linha"
               echo "Velho: $valor_antigo"
               echo
               echo -n "Deseja usar o valor antigo?"
               read -n 1 resposta
               echo
           done
           if [ "$resposta" == "S" ] || [ "$resposta" == "s" ]; then
               echo "$valor_antigo" >> $FINAL
           else
               echo "$linha" >> $FINAL
           fi
       fi
   fi
done


--
Atenciosamente,

          Junior Polegato

          Um peregrino de problemas; Um pergaminho de soluções!
          Página Profissional: http://www.juniorpolegato.com.br



Reply to: