Вы можете обработать список всех макетов и для каждого элемента в списке проверить каждый соответствующий вариант для символов level3 :
list=($(sed '/! layout/,/^$/!d;//d
s/[[:blank:]]*\([^[:blank:]]*\)[[:blank:]].*/\1/' \
< /usr/share/X11/xkb/rules/evdev.lst))
layouts=("${list[@]##*/}")
for i in "${layouts[@]}"; do
sed -n '\|//.*level3|d;H;/xkb_symbols/{s/.*"\(.*\)".*/'"${i}:"'\1/;h}
/^};/{x;/level3/d;s/\n.*//p}' < /usr/share/X11/xkb/symbols/${i}
done
Первый sed
перечисляет все макеты в /usr/share/X11/xkb/rules/evdev.lst
и сохраняет результат в массиве list
. Затем элементы этого массива обрабатываются посредством раскрытия параметров, чтобы получить только имя макета (например, извлечь jp
из nec_vndr / jp
) и сохранить в массиве макетов
].
Затем для каждого элемента
в макетов
соответствующий / usr / share / X11 / xkb / symbols / $ {item}
файл обрабатывается для извлечения вариантов, у которых нет символов level3 : sed
first d
удаляет все закомментированные строки, содержащие level3
, затем безусловно добавляет каждую строку в старый буфер H
. Он редактирует строку, содержащую имя варианта, добавляя имя макета перед именем макета и перезаписывая старый буфер h
, затем в конце каждого раздела вариантов ( / ^}; /
) он e x
изменяет буферы, удаляя пространство шаблонов, если оно содержит level3
, иначе печатает только первую строку (то есть layout: вариант ). Результат будет примерно таким:
us:basic
us:ibm238l
us:dvorak
us:dvorak-l
us:dvorak-r
us:dvorak-classic
us:dvp
us:olpc2
us:chr
us:carpalx
us:carpalx-full
us:alt-intl-unicode
us:sun_type6
............
dk:nodeadkeys
dk:winkeys
dk:mac
dk:mac_nodeadkeys
dk:dvorak
dk:sun_type6
............