我需要列出所有可能的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 jp
from 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
............