Я не уверен, что это возможно, поскольку будет трудно дифференцироваться между измененными, добавленными и удаленными строками.
Рассмотрите этот файл:
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
или я редактировал его?
У меня был тот же вопрос. Эта функция была моим решением получить максимальный номер строки изменения (т.е. изменения запускаются с буквы '+'). После которого я затем цикл через различный файл снова линию за линией и не отправляют к процессору строки, пока это не инициировало строку для обработки:
#====================================================================
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
sdiff file1 file2
без строк, которые имеют записи с обеих сторон. При обработке всех измененных строк, как удалено и добавленных строк Вы в основном получаете выводcomm -3 file1 file2
– nagul 25.09.2009, 17:38