Isso não é um comando sed
dentro de sed
, é apenas um substituto que seu shell faz antes de realmente chamar sed
. Basta usar aspas e parênteses adequados e pronto:
sed -i.bak -e "$(sed -n 1,1p file.txt),\$d" output.file
Aspas duplas permitem a substituição do processo dentro (aspas simples não) e a sintaxe $()
significa que o resultado do comando interno é capturado e substituído. Observe que \$
teve que ser salvo para evitar que $d
seja interpretado como uma variável.
Uma maneira menos confusa de escrever a mesma coisa seria
n=$(sed -n 1,1p file.txt)
sed -i.bak -e "${n}\$d" output.file
Você também pode escrevê-lo como "${n}"',$d'
, em bash
você pode concatenar cadeias de caracteres diferenciadas entre aspas (incluindo strings sem aspas) simplesmente colocando-as uma ao lado da outra.
Além disso, você pode querer escrever sed -n '1{p;q}' file.txt
. Primeiro de tudo, você não precisa escrever um intervalo se você especificar apenas um número de linha. Em segundo lugar, se você sair depois de imprimir a primeira linha ( q
), ele não lê o arquivo inteiro sem motivo - mais eficiente. Porque é uma primeira linha, -n
também pode ser omitido. Ou você poderia usar head -n1 file.txt
.