Usando sed
Vamos criar um arquivo de teste:
$ seq 10 >file
Para mover, digamos, a linha 5 para o topo de um arquivo:
$ sed '1,4{H;1h;d}; 5{p;x}' file
5
1
2
3
4
6
7
8
9
10
Como funciona
-
1,4{H;1h;d}
Isso salva as linhas de 1 a 4 no espaço de espera.
Mais detalhadamente,
H
anexa a linha atual ao espaço de espera depois de anexar uma nova linha ao espaço de armazenamento. Para a linha 1, não queremos essa nova linha, então emitimos o comando1h
que envia a linha 1 para o espaço de espera sem nenhuma nova linha. O comandod
exclui a linha atual do espaço de padrões para que ela não seja impressa ainda. -
5{p;x}
Isto imprime a linha 5 e depois imprime o espaço de espera.
p
informa ao sed para imprimir o espaço do padrão (que contém a linha 5).x
diz ao sed para colocar para trocar o padrão e manter espaço para que o que estava no espaço de retenção seja agora impresso.
Linhas após a linha 5 são transmitidas inalteradas.
Usando o awk
$ awk 'NR<5{s=s ORS $0;next} NR==5{print $0 s;next} 1' file
5
1
2
3
4
6
7
8
9
10
A lógica aqui é bem parecida com a do sed. Nós salvamos todas as linhas antes da linha 5 na variável s
. Quando chegamos na linha 5, imprimimos seguidos por s. As linhas restantes são passadas inalteradas.