Done in 2 steps Tested and worked fine in both scenarios
а. cp orginalfile fileneedto_be_changed
' (Нужно сделать только один Раз)
orginalfile=====>which supposed to be changed
б.
differencecount=`awk 'NR==FNR{a[$0];next}!($0 in a){print $0}' orginalfile fileneedto_be_changed|wc -l`
if [ $differencecount -eq 0 ]
then
echo "NO changes in file"
else
echo "Noted there is changes in file"
fi
-121 ---47558 -Поскольку вы не знакомы с Perl, я буду немного многословен.
Во-первых, Perl — это утилита Linux, которая берет ваш входной файл и преобразует его с помощью команд для получения желаемого результата.
Обычно Perl проверяет входной файл построчно. Строка отделяется от следующей с помощью символа ascii \012
, также известного как \n
, называемого новой строкой. Но в этом случае мы бы предпочли читать абзац за раз. И как Perl идентифицирует пара?
-00
будет обрабатывать пп. Они сохраняются в скаляре текущей записи$_
Обратите внимание, что запись теперь должна состоять из нескольких строк.
Я представляю это как :^....$ ^...$ ^....$
В основном смежные острова линий. Все острова разделены символом \n.
Используемые параметры Perl:
-l
это делает две вещи,удалить разделитель входной записи из текущей записи, $ _, и при печати поставить его обратно :$/ = $\ = "\n"
-s
это включает рудиментарный синтаксический анализ переключателей командной строки. С его помощью мы можем указать порядок вывода переменных из самой командной строки.
-00
— разделитель IRS, установленный в режим абзаца = пустая строка. Это будет поглощать абзацы из входных данных по одному и сохранять в $_
для каждой итерации.
-n
это создает цикл вокруг файла, что означает, что он будет считывать из входного файла (на самом деле дескриптор файла, но это несущественно для нашего уровня )но не будет печатать его в конце, когда все преобразования завершены были применены к текущей записи. Вы должны сделать это явно.
-e
Это параметр, сообщающий Perl, что следующий за ним правильный код Perl будет применен к текущей записи.
--
=>конец параметров командной строки Perl и то, что следует сейчас, это переключатели (, которые начинаются с тире ), а затем файлы до конца. Если у вас могут быть имена файлов, начинающиеся с тире, лучше начинать их с./ или указывать полный или относительный путь, или поместить еще один --
, чтобы сигнализировать об окончании переключателей.
Теперь идет algorithm
часть:
my %h = reverse /^(([^:]+):. *)$/mg;
В Perl хэши или ассоциативные массивы обозначаются процентом %
перед их именем. Таким образом, в нашем случае мы строим хеш %h
и помещаем my
перед ним, что означает, что он будет лексическим и выйдет из области видимости всякий раз, когда считывается следующая запись. Это означает, что новый новый хэш создается для каждого записывать.
Что означает выражение /..../mg
? Во-первых, все регулярные выражения всегда привязаны к какой-либо скалярной переменной или выражению с помощью оператора if =~
. Но здесь мы не видим ни одного. Неявно он привязан к переменной $_
, что в данном случае означает текущую запись.
Продолжение следует---