Quanto ao erro do seu script, você está substituindo A ou a por AB e D ou d por DK , portanto, qualquer B ou K preexistente não seria afetado; sed não está procurando por isso. Você pode colocar um opcional [bB] ou [kK] usando ? (zero ou um dos caracteres anteriores) para fazer com que ele substitua esse caractere também se ocorrer.
Para garantir que a substituição só aconteça se [aA] ou [aA][bB] etc for seguido por um número, você poderá adicionar o número ao padrão e adicioná-lo novamente à substituição por () e
sed -r 's/ab?([0-9])/AB/Ig;s/dk?([0-9])/DK/Ig' filename
Estou usando -r para usar ERE (portanto, não é preciso escapar de ? ) e I para pesquisa sem distinção entre maiúsculas e minúsculas, em vez de usar classes de caractere.