Как я могу заставить разность показывать только добавленные и удаленные строки

Как я могу получить шоу разности команды Unix только добавленные и удаленные строки? Если разность не может сделать этого, какой инструмент может?

2
задан 25.09.2009, 16:43

3 ответа

Я не уверен, что это возможно, поскольку будет трудно дифференцироваться между измененными, добавленными и удаленными строками.

Рассмотрите этот файл:

start
old
old
old
end

Мы редактируем его так, это похоже на это:

start
old
old but now new
new
new
end

Если мы diff это мы получаем этот вывод:

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

Это просто для генерации. Но если Вы спрашиваете diff чтобы только распечатать добавленную и удаленную строку, я думаю, что это становится делом вкуса, какие строки были добавлены и удалены и которое было изменено. Например, сделал я удаляю последнюю строку, которая сказала old и замените его строкой, которая сказала new или я редактировал его?

3
ответ дан 08.12.2019, 04:44
  • 1
    (+1) в принципе, но существует способ получает, какая разность думает, - добавленные и удаленные строки. Другими словами, покажите ouput sdiff file1 file2 без строк, которые имеют записи с обеих сторон. При обработке всех измененных строк, как удалено и добавленных строк Вы в основном получаете вывод comm -3 file1 file2 – nagul 25.09.2009, 17:38

Делает diff -u0 что Вы хотите?

6
ответ дан 08.12.2019, 04:44
  • 1
    Разность на Экс-ан-Провансе не распознает-u0 (к сожалению). – C. Ross 25.09.2009, 17:48
  • 2
    Вы могли установить разность GNU. – dmckee 25.09.2009, 18:11

У меня был тот же вопрос. Эта функция была моим решением получить максимальный номер строки изменения (т.е. изменения запускаются с буквы '+'). После которого я затем цикл через различный файл снова линию за линией и не отправляют к процессору строки, пока это не инициировало строку для обработки:


#====================================================================
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
}

Вот функция:


#====================================================================
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

2
ответ дан 08.12.2019, 04:44

Теги

Похожие вопросы