Actualizar el paquete grub2 -2.02 -0.64.el7.x86 _64 a la siguiente versión que es la 0.65
В Питоне:
#!/usr/bin/python3
with open("file.txt", "r") as ins:
lines = []
for line in ins:
if line.startswith((" ", "\t")):
lines.append(line)
else:
lines.sort()
print(*lines, end = "", sep = "")
print(line, end = "")
lines = []
lines.sort()
print(*lines, end = "", sep = "")
Это сортирует все разделы (отдельно ), а не только разделы между двумя конкретными строками.
Вот способ отсортировать отдельный раздел с помощьюex
:
ex file <<%
/HUT
+1,/HUT/-1!sort
w file.sorted
q
%
$ awk 'BEGIN { OFS="\t"; s=0 } /^[^[:blank:]]/ { print ++s "\b", $0; next } { print s, $0 }' file | sort -n | cut -f 2-
0ce Handle Bars
0cf Front Brake
0d0 Rear Brake
HUT 03 VR Controls
000 Unidentified
001 Belt
002 Body Suit
003 Flexor
004 Glove
005 Head Tracker
006 Head Mounted Display
007 Hand Tracker
008 Oculometer
009 Vest
00a Animatronic Device
020 Stereo Enable
021 Display Enable
HUT 04 Sport Controls
000 Unidentified
001 Baseball Bat
002 Golf Club
Здесь используется awk
для добавления номера (и разделителя табуляции )перед каждой строкой, соответствующей разделу, в котором находится эта строка. Для заголовков разделов мы добавляем число, за которым следует символ возврата. (только потому, что забой сортируется перед вкладками ). Затем мы просто сортируем полученные данные по этим числам, прежде чем удалить их и добавленные разделители табуляции.
Заголовки разделов обнаруживаются путем поиска не -пустых символов в начале строки.
Вы можете заставить awk
и sort
сотрудничать, чтобы выполнить работу.
awk '
/^[[:blank:]]/{print | "sort"; next}
{close("sort"); print};
END{close("sort")}
' file
sort
close
на sort
, когда встречается маркер раздела; это приводит к тому, что sort
сбрасывает свой вывод на стандартный вывод и выходит sort
заменяет строки содержимого, следующие за маркером раздела close
на sort
в конце, чтобы позаботиться о конечном содержимом Для таких задач мне часто бывает утомительно писать сценарий. Если это нужно сделать только один раз и, возможно, для нескольких файлов, это можно сделать с помощью макроса, если вы откроете файл в vim
и наберете:
GoFAKE SECTION<ESC>
:добавьте поддельный раздел в конце и убедитесь, что он находится в начале строки (возможно, у вас включен cindent
или autoindent
). Это также необходимо для сортировки последнего раздела. gg
:вернуться к началу файла,затем файл начинается с раздела, идущего вниз на одну строку сj
qq
:начать запись макроса в регистр q v
:выбор начала /^\S\+<Enter>
:поиск начала следующего раздела k
:вверх на одну строку :!sort<Enter
:отсортировать раздел nj
:перейти к первому элементу следующего раздела q
:остановить запись макроса @q
:повторить макрос 100@@
:повторить макрос несколько раз (до тех пор, пока не останется разделов)dd
:удалить последнюю строку файла (FAKE SECTION
)Возможно, вы захотите :set lazyredraw
ускорить выполнение макроса.