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? .