Você pode processar a lista de todos os layouts e, para cada item da lista, verificar cada variante correspondente para os símbolos level3 :
list=($(sed '/! layout/,/^$/!d;//d
s/[[:blank:]]*\([^[:blank:]]*\)[[:blank:]].*//' \
< /usr/share/X11/xkb/rules/evdev.lst))
layouts=("${list[@]##*/}")
for i in "${layouts[@]}"; do
sed -n '\|//.*level3|d;H;/xkb_symbols/{s/.*"\(.*\)".*/'"${i}:"'/;h}
/^};/{x;/level3/d;s/\n.*//p}' < /usr/share/X11/xkb/symbols/${i}
done
O primeiro sed
lista todos os layouts em /usr/share/X11/xkb/rules/evdev.lst
e salva o resultado na matriz list
. Os elementos dessa matriz são processados posteriormente por meio de expansão de parâmetro para obter apenas o nome do layout (por exemplo, extrair jp
de nec_vndr/jp
) e salvos na matriz layouts
.
Então, para cada item
em layouts
, o arquivo /usr/share/X11/xkb/symbols/${item}
correspondente é processado para extrair as variantes que não possuem símbolos level3 : sed
first d
elimina todas as linhas comentadas que contêm level3
, em seguida, adiciona incondicionalmente cada linha ao buffer H
old. Ele edita a linha que contém o nome da variante que precede o nome do layout e sobrescreve o buffer h
old e, ao final de cada seção variante ( /^};/
), ele e x
altera os buffers, excluindo o espaço padrão se ele contiver level3
else imprimir apenas a primeira linha (ou seja, layout: variante ). Então o resultado é algo assim:
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
............