Как заменить повторяющиеся многострочные -группы линий, например. из git и diff3

Для вашей версии 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пакет, который вы ищете.

0
28.03.2021, 13:01
2 ответа

Для решения этой проблемы программа 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 без -, но его включение полезно для согласованности. Кроме того, эффективность :маркеров конфликта является взаимоисключающей; зачем тестировать =======, если вы обнаружили <<<<<<<.

0
19.08.2021, 22:31

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в этом решении не требуются переменные состояния, и ни одно правило не должно явно выходить из неявного цикла для перехода к следующей записи.

0
20.08.2021, 00:24

Теги

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