Для вашей версии Ubuntu(16.04)это последняя версия пакета. Согласно вашей собственной ссылке, если вам нужна именно эта версия, вам необходимо перейти на:
disco (19.04) (libs): Structured File Library - runtime version
Если вам нужна последняя версия пакета для вашей версии Ubuntu, воспользуйтесь этой ссылкой:
https://packages.ubuntu.com/search?keywords=szPackageName&searchon=names&suite=xenial§ion=all
Где вы меняете szPackageName
пакет, который вы ищете.
Для решения этой проблемы программа Awk с отслеживанием состояния может быть вполне понятной:
awk '/^<<<<<<</ { state = 1; next }
/^=======/ { state = 2; next }
/^>>>>>>>/ { state = 0; next }
state == 0 || state == 2' data
foo
prolog
AAC
BBC
epilog
bar
Где data
содержит:
foo
prolog
<<<<<<< HEAD
ACA
BCB
||||||| parent of 0cfd85b8e3... Beautify.
AAA
BBB
=======
AAC
BBC
>>>>>>> 0cfd85b8e3... Beautify.
epilog
bar
Изначально мы находимся в состоянии 0, потому что state == 0
истинно, если state
еще не инициализировано. Мы переключаемся в состояние 1, когда видим <<<<<<
, и в состояние 2, когда видим =======
, а затем возвращаемся в состояние 0, когда видим маркер конца >>>>>>>
. Очень простой.
Мы печатаем строки, только если мы находимся в начальном состоянии 0 (за пределами любого маркера конфликта )или в состоянии 2 (последней части маркера конфликта ).
Команды next
во всех случаях гарантируют, что у нас не будет падения -из-за поведения. Только последний случай печатает что-либо, поэтому мы знаем, что первые три случая ничего не делают, кроме как распознают маркеры конфликтов и изменяют состояния, ничего не печатая. Таким образом, маркеры конфликта не печатаются, независимо от того, в каком состоянии мы находимся; мы знаем, что в состоянии 2 и при возврате в состояние 0 мы случайно не напечатаем строку =======
или >>>>>>>
.
next
не является строго необходимым в первом действии, потому что оно переходит в состояние печати 1 без -, но его включение полезно для согласованности. Кроме того, эффективность :маркеров конфликта является взаимоисключающей; зачем тестировать =======
, если вы обнаружили <<<<<<<
.
TXR Макрос Lisp awk
может решить эту проблему без переменных состояния, потому что он имеет более мощные выражения диапазона, чем обычный Awk:
выражения диапазона могут комбинироваться с другими выражениями. Например, выражение диапазона может быть началом или концом другого диапазона;
выражения диапазона могут использоваться в любом месте макроса awk
, а не только как условия главного предложения; и
выражения диапазона бывают девяти различных вариантов для исключения записей в начале и в конце или расширения диапазона для включения большего количества записей.
Использование того же файла data
, что и ответ Awk:
$ txr awk.tl data
foo
prolog
AAC
BBC
epilog
bar
Код вawk.tl
:
(awk
(:let (beg (f^ #/<<<<<<</))
(mid (f^ #/=======/))
(end (f^ #/>>>>>>>/)))
((-rng- mid end)) ; print lines between ===...>>>, exclusive
((not (rng beg end)))) ; print lines outside <<<...>>>
Разбивка:
Во-первых, есть предложение (:let...)
, которое связывает некоторые лексические переменные в рамках формы awk
. Введем переменные beg
, mid
и end
, значениями которых являются анонимные функции с одним -аргументом. Например,(f^ /abc/)
дает функцию, которая принимает строку и сопоставляет регулярное выражение abc
, привязанное к началу этой строки. Мы определяем функции для сопоставления начала, середины и конца маркера конфликта diff3.
После :let
у нас есть два пункта (condition action)
. Ни в одном предложении нет action
, поэтому действие по умолчанию — печать. Это форма Awk, поэтому применяются те же правила.
Диапазон (-rng- mid end)
соответствует записям от маркера mid
до маркера end
. Вариант -rng-
верен только для внутренних записей ареала; это дает false для первой и последней записи. Это именно то, что мы хотим :мы хотим напечатать все строки между ======
и >>>>>>>
, но не включая эти строки. В Awk нет такой функции для исключения конечных точек из диапазона.
Условие второго правила (not (rng beg end))
. Это условие верно для записей, которые не находятся в диапазоне от beg
до end
; т. е. не в аннотации конфликта diff3. Мы хотим напечатать все это.В Awk также нет такой возможности :выражение диапазона нельзя комбинировать ни с каким другим оператором, таким как !
отрицание.
Из-за особенностей диапазона в TXR Lisp awk
в этом решении не требуются переменные состояния, и ни одно правило не должно явно выходить из неявного цикла для перехода к следующей записи.