Я использую следующую команду: diff -u file1 file2 > diff.txt
и анализирую вывод. У меня есть цикл, который может перебирать каждую строку в файле. Я использую решение цикла от https://stackoverflow.com/a/1521498/17386696.
while IFS = "" read -r p || [ -n "$p" ] ; do
# first character '+'
if [[ ${p:0:1} = "+" ]] ; then
# do something
# first character '-'
elif [[ ${p:0:1} = "-" ]] ; then
# do something
fi
done < diff.txt
Моя текущая проблема заключается в том, что первые две строки файла выглядят так:
--- file1 2022-03-19 12:28:10.119916406 -0400
+++ file2 2022-03-19 12:28:11.171926970 -0400
Я знаю, что мог бы создать другой условный оператор для строк +++
и ---
, если ничего не помогает. Мне было любопытно, есть ли способ настроить цикл так, чтобы он начинался с третьей строки, чтобы избежать тройных символов.
также done < <(sed '1,2d' diff.txt)
и done < <(awk 'NR>2' diff.txt)
Учитывая небольшое количество строк (2), которые следует игнорировать, я предлагаю следующее:
{
read; read
while IFS = "" read -r p || [ -n "$p" ] ; do
...
done
} < diff.txt
read; read
читает первые две строки из стандартного ввода (diff.txt).
Оно работает! Не могли бы вы объяснить, что делают фигурные скобки? Я не до конца их понимаю.
{ ...; }
— составная команда. В нем все команды могут читаться с одного и того же стандартного ввода (diff.txt
).
попробуйте
done < <(tail +3 diff.txt)
илиdone < <(tail -n +3 diff.txt)