Antecedentes
sed não pode expandir as variáveis shell ou ambiente. Em vez disso, você precisa selecionar aspas que permitem que o shell, Bash, faça a expansão. Quando eles são colocados entre aspas duplas, o Bash expandirá variáveis dentro, mas não quando elas estiverem entre aspas simples. Para usar aspas simples, você precisa fazer algo assim:
$ sed -n '1,'$k'p' file
AVISO: Acima, nós expusemos a variável $k para que não fique entre aspas dos argumentos sendo passados para sed . Ao fazer isso, o shell, Bash, expandirá $k para qualquer valor definido.
Se você usar aspas duplas, poderá usar a notação ${var} para proteger a variável entre aspas duplas, para que o shell a expanda. Abaixo a notação ${k} é necessária porque senão o nome da variável $k seria seguido pelo p , levando o shell Bash a pensar que o nome da variável é $kp .
$ sed -n "1,${k}p" file
Você também pode fazer o acima, colocando um espaço entre a variável, $k e o p . Isso funciona porque a sintaxe sed permite espaços em branco entre um endereço e um comando (em outras palavras, o espaço é passado para o sed com esse formulário, diferente de ${k} ).
$ sed -n "1,$k p" file
OBSERVAÇÃO: você precisa usar um pouco de cautela com esses métodos, pois eles falharão se $k não estiver definido:
$ printf "blah %d\n" $(seq 10) | sed -n '1,'$k'p'
sed: -e expression #1, char 3: unexpected ','
Exemplo
Aqui está a variante ${k} com cotação dupla como exemplo:
$ k="3"; printf "blah %d\n" $(seq 10) | sed -n "1,${k}p"
blah 1
blah 2
blah 3
shell vs. variáveis de ambiente
Para saber mais sobre esse assunto, recomendo que você leia este documento Q & A intitulado: Qual é a diferença? em uso entre variáveis de shell e variáveis de ambiente? .