Диалоговые окна в сценариях конфигурации пакетов Debian обычно обрабатываются debconf
; пакеты, которые поддерживают это, будут иметь соответствующие файлы .config
и .templates
в /var/lib/dpkg/info
(, например./var/lib/dpkg/info/tzdata.config
и /var/lib/dpkg/info/tzdata.templates
). (Это дает и другие преимущества, такие как простая поддержка предварительного -заполнения.)
Выполнение dpkg-reconfigure
запускает сценарий postinst
сопровождающего пакета в режиме configure
, поэтому то, что происходит, когда вы это делаете, действительно зависит от того, что предоставляет сопровождающий. Большинство пакетов предназначены для автоматической установки, поэтому они не обеспечивают интерактивную настройку через dpkg-reconfigure
.
Дополнительные зеркала apt
настраиваются модулем установщика, а не скриптом postinst
, и, насколько мне известно, они недоступны после установки.
Использованиеawk
:
awk '
$0=="General" || $0=="Idiom"{
type=$0; getline
group=$0; getline
key=type","group
if (key in b){
b[key]=b[key]"\n"$0
}
else {
if (type=="General" && !isfirstgeneral){
type=type"\n"; isfirstgeneral=1
}
else if (type=="Idiom" && !isfirstidiom){
type=type"\n"; isfirstidiom=1
}
else {
type=""
}
a[++cnt]=key
b[key]=type group"\n"$0
}
}
END{
for (i=1;i<=cnt;i++){
print b[a[i]]
if (i<cnt) print "-"
}
}' file
Если это строка General
или Idiom
, сохраните эту строку как type
и получите следующие две строки (с именем group
и "определение" с именем$0
).
Два массива используются как уловка для предотвращения awk
возможного хаотического упорядочения элементов массива при зацикливании:
a
с целочисленным ключом хранит ключ массива b
, состоящего из type
и следующей group
строки b
содержит собранную строку для данного ключа Если комбинированный ключ для массива b
не существует, создайте два новых элемента массива. Строки type
сохраняются только при первом их обнаружении. (, если это была ошибка в выводе, то удалите блокif-else if-else
-и замените b[key]=type group"\n"$0
на b[key]=type"\n"group"\n"$0
).
Если ключ существует, добавьте строку «определение» к существующему значению массива.
В части END
выведите значения массива b
, используя порядок массива a
, за которым следует разделительная строка.
(Я сохранил ваш ввод как файл file
, но вы можете передать вывод вашей команды curl
в этот awk-скрипт, если хотите.)
Выход:
General
hit
definition 1
definition 2
-
Idiom
hit the sack
Definition
-
hit the buffers
Definition 1
Definition 2
Обновление
Чтобы использовать список категорий, добавьте свои категории в текстовый файл, по одной строке на категорию.
Примерcategories.txt
:
General
Idiom
Computer
What ever
Измените сценарий на
awk '
NR==FNR{
cat[$0]; next
}
$0 in cat{
type=$0; getline
group=$0; getline
key=type","group
if (key in b){
b[key]=b[key]"\n"$0
}
else {
a[++cnt]=key
b[key]=group"\n"$0
}
}
END{
for (i=1;i<=cnt;i++){
# print first occurrence of category
catname=a[i]
sub(/,.*/, "", catname)
if (catname in cat){
print catname
delete cat[catname]
}
print b[a[i]]
if (i<cnt) print "-"
}
}' categories.txt file
Несколько дерзкое использование awk
ассоциативных массивов.....
awk '$0=="General"||$0=="Idiom"{
cat=$0;getline; def=$0; getline;
(cat=="General")?gen[def]=gen[def]"\n"$0:idi[def]=idi[def]"\n"$0
}END{
print "General";for (g in gen) print g, gen[g]"\n-";
print "Idioms";for (i in idi) print i, idi[i]"\n-"
}' file
Выход:
General
hit
definition 1
definition 2
-
Idioms
hit the buffers
Definition 1
Definition 2
-
hit the sack
Definition
-
Это предполагает, конечно, что все ваши определения являются "однострочными"
Больше категорий Не беспокоясь о порядке появления категорий...
awk '{
cat=$0; getline; phr=$0;getline; def=$0; getline;
cats[cat];defs[phr]=cat;txt[phr]=txt[phr]"\n"def
}END{
for (c in cats) {
print c":"; for (d in defs) {
if (defs[d]==c) print d, txt[d]"\n-"
}
}
}' file
Вход
General
hit
Strike a blow.
-
General
hit
A successful search result.
-
Idiom
hit the sack
Go to bed.
-
Idiom
hit the buffers
Reach the end of the line.
-
Idiom
hit the buffers
Reach the limit.
-
Bananas
Banana
A Banana
Выход
Bananas:
Banana
A Banana
-
Idiom:
hit the buffers
Reach the end of the line.
Reach the limit.
-
hit the sack
Go to bed.
-
General:
hit
Strike a blow.
A successful search result.
-
Если вы хотите управлять выводом категории в той же последовательности, в которой вы их найдете, вам нужно будет либо перечислить их, либо создать строку, разделенную (, скажем,)|
для всех cat
, затем split
в перечисляемый массив, а затем используйте его как итератор для других массивов.
Здесь действительно используется 4-строчная последовательность в записях.