Há apenas um pequeno erro em sua expressão sed : o caractere mais + precisa ser ignorado.
echo "state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES," | sed -n -e 's/^.*keycode\s\([0-9]\+\).*$//p'
processa 64 conforme esperado. Aqueles que usaram a sintaxe PCRE devem prestar atenção nas diferenças ao usar outras ferramentas como sed ou awk , cada um tendo um conjunto peculiar de caracteres especiais, alguns dos quais precisam ser escapados, outros não.
Um exemplo é \d , que significa qualquer dígito no PCRE e tem um significado diferente em sed , conforme apontado por Cyrus em seu comentário: [0-9] ou [[:digit:]] deve ser usado no lugar.
perl -e é geralmente tão capaz quanto sed e awk , você pode querer considerar usá-lo se preferir sua sintaxe. Pode ser mais ou menos confuso do que suas contrapartes, dependendo do que você precisa fazer.
Veja introdutório artigos para perl -e , experimente com PCRE ou leia um sed útil ou awk tutorial.