Esta expressão regular:
^[0-9]\{1,3\}
informa ao sed para procurar:
-
^
- o começo da linha, seguido por -
[0-9]
- um único dígito,\{1,3\}
- repetido de 1 a 3 vezes, seguido por - nada ou nada
... que corresponde a todas as linhas da sua entrada de amostra, como você viu. Ele corresponde às três primeiras linhas porque elas começam com um, dois ou três dígitos. Ele combina com as linhas subsequentes porque todas começam com 3 dígitos (e continuam, mas o regex não se importa).
As expressões regulares são "gulosas", o que significa que, por padrão, elas corresponderão o máximo que puderem (dada toda a flexibilidade que você codifica em todo o regex), mas também "preguiçoso", pois não precisam corresponde à linha inteira, a menos que você a ancore especificamente em ambas as extremidades com ^
e $
.
Assumindo que sua intenção é dizer ao sed para imprimir somente as linhas que têm exatamente um a três dígitos, você precisa dizer à expressão regular que é todo você quero ver na linha inteira, o que requer a âncora final.