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