Intereting Posts
Как я могу заставить systemd использовать qingy в качестве моей программы tty по умолчанию вместо agetty (debian jessie)? Как заставить USB-накопитель автоматически монтироваться? Удалить новую строку в журнале Postgresql перед отправкой в ​​Graylog Исправить слишком длинную цепочку хеш-маршрутов без перезагрузки Как фильтровать файлы с именем файла, а затем удалять файл OLDEST? как различать пользовательские сервисы и системные службы в systemd? Создайте символическую копию другого каталога, у которого есть свои локальные данные Полный путь в glob в Zsh Перемещение файлов между двумя дисками удаленно Каковы обычные разрешения файлов для каждого типа файлов до применения umask Может ли один пользователь иметь несколько файлов crontab? Использование источника, загружаемого в Windows на платформе Linux grep файл из файла Что такое «домашний каталог»? bash + как рассчитать очень длинные числа в bash?

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

Мне нужно указать все возможные макеты xkb и их соответствующие варианты, которые не используют символы третьего уровня. Вручную просматривать все файлы в каталоге /usr/share/X11/xkb/symbols/ является сумасшедшим, может быть, проще?

Вы можете обработать список всех макетов и для каждого элемента в списке проверить каждый соответствующий вариант для символов уровня 3:

 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 ) и сохранены в layouts массива.
Затем для каждого item в layouts обрабатывается соответствующий файл /usr/share/X11/xkb/symbols/${item} для извлечения вариантов, которые не имеют символов уровня 3: sed first d eletes все прокомментированные строки, которые содержат level3 , затем безоговорочно добавляет каждую строку в старый буфер H Он редактирует строку, содержащую имя варианта, которое добавляет имя макета и перезаписывает h старый буфер, а затем в конце каждого раздела варианта ( /^};/ ) оно e x изменяет буферы, удаляя пространство шаблонов, если оно содержит level3 else печать только первой строки (например, макет: вариант ). Таким образом, результат выглядит примерно так:

 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 ............