Como posso obter o diff para mostrar apenas as linhas adicionadas e excluídas

2

Como posso obter o comando unix diff show apenas linhas adicionadas e excluídas? Se diff não pode fazer isso, qual ferramenta pode?

    
por C. Ross 25.09.2009 / 14:46

3 respostas

3

Não tenho certeza de que isso seja possível, pois será difícil diferenciar as linhas alteradas, adicionadas e excluídas.

Considere este arquivo:

start
old
old
old
end

Nós editamos para que fique assim:

start
old
old but now new
new
new
end

Se nós diff obtivermos esta saída:

< old
< old
---
> old but now new
> new
> new

Isso é fácil de gerar. Mas se você perguntar a diff para imprimir apenas linhas adicionadas e excluídas, acho que se torna uma questão de opinião quais linhas foram adicionadas e excluídas e quais foram alteradas. Por exemplo, excluí a última linha que dizia old e a substitui por uma linha que dizia new ou editei?

    
por 25.09.2009 / 16:23
6

O diff -u0 faz o que você quer?

    
por 25.09.2009 / 15:47
2

Eu tive a mesma pergunta. Esta função foi a minha solução para obter o número máximo de linhas de alteração (ou seja, as alterações começam com a letra '+'). Depois disso, em seguida, percorro o arquivo diff novamente linha a linha e não envio para o processador de linha até que isso acione a linha a ser processada:


#====================================================================
proc_diff_file()    # processes a diff file
#====================================================================
# Arg_1 = Diff File Name
# Arg_2 = New File Name - the one with the new lines
{
  NEW_FILE=$1
  A_FILE=$2
  if [ -f "$A_FILE" ]; then
    echo "processing diff $A_FILE"
    pre_process_diff $A_FILE
    # Set loop separator to end of line
    ndx=0
    BAKIFS=$IFS
    IFS=$(echo -en "\n\b")
    exec 3<&0
    exec 0<$A_FILE
    while read line
    do
      ndx=$(expr $ndx + 1)
      # use $line variable to process line in processLine() function
      if [ $ndx > $max_ndx ]; then
        proc_age $line
      fi
    done
    exec 0<&3
    # restore $IFS which was used to determine what the field separators are
    IFS=$BAKIFS

#    cleanup $NEW_FILE

    echo "processing diff $A_FILE done"
  fi
}

Aqui está a função:


#====================================================================
pre_process_diff()  # pre-processes a diff file for last changed line
                    # sets a variable named $max_ndx
#====================================================================
# Arg_1 = Diff File Name
{
  A_FILE=$1
  max_ndx=
  # collect last line number of diff + 
  # all lines following are new data
  'grep -n "^[+]" $A_FILE | gawk '-F:' '{ print $1 }' >tmp'
  # Set loop separator to end of line
  # read through to the last line number
  BAKIFS=$IFS
  IFS=$(echo -en "\n\b")
  exec 3<&0
  exec 0<tmp
  while read last_line
  do
    max_ndx=$last_line
  done
  exec 0<&3
  # restore $IFS which was used to determine what the field separators are
  IFS=$BAKIFS
  echo "pre-processing diff $A_FILE done max_ndx=$max_ndx"
}

Steve

    
por 15.04.2011 / 14:55