如何列出不使用第三级符号的所有布局和相应变体?

如何列出不使用第三级符号的所有布局和相应变体?

我需要列出所有可能的xkb布局及其各自不使用第三级符号的变体。手动检查/usr/share/X11/xkb/symbols/目录中的所有文件是疯狂的,也许有更简单的方法?

答案1

您可以处理所有布局的列表,并为列表中的每个项目检查每个相应的变体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。然后通过参数扩展进一步处理该数组的元素,仅获取布局名称(例如 extract jpfrom nec_vndr/jp)并保存到数组中layouts
然后,对相应文件item中的每个进行处理,以提取没有的变体layouts/usr/share/X11/xkb/symbols/${item}3级符号:sed首先d删除包含 的所有注释行level3,然后无条件地将每一行附加到H旧缓冲区。它编辑包含在布局名称前面的变体名称的行并覆盖h旧缓冲区,然后,在每个变体部分的末尾(/^};/)它x更改缓冲区,删除模式空间,如果它包含level3仅打印第一行(即布局:变体)。所以结果是这样的:

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

相关内容