Você também pode fazer isso com um Ex
comando usando sed
como filtro externo:
:%!sed -n 'h;n;G;h;n;G;h;n;G;p'
Esta versão ignorará (excluir) quaisquer linhas extras além de um múltiplo de 4. Para manter o último conjunto de menos de 4 linhas (invertido), use:
:%!sed -n '$p;h;n;G;$p;h;n;G;$p;h;n;G;p'
o %
aqui significa "Toda linha no buffer".
O !
comando significa "Execute o seguinte comando com as linhas especificadas como entrada e substitua as linhas especificadas pela saída do comando". (É chamado de filtro; muito útil para coisas como classificação, por exemplo, :%!sort
classificará todas as linhas do seu arquivo; :2,8!sort
classificará as linhas 2 a 8, etc.)
sed
é a ferramenta de edição de fluxo e é encontrada em todos os sistemas semelhantes ao Unix. Os principais conceitos sed
usados aqui são o "espaço do padrão" (que por padrão contém apenas cada linha da entrada) e o "espaço de espera" (onde é possível colar texto extra ao usarsed
para salvá-lo enquanto processa outras linhas de entrada).
-n
é uma opção do sed
comando para suprimir suas ações padrão de impressão do espaço do padrão (porque, neste caso, só queremos imprimir quando o explicitarmos).
$p
no sed
comando significa "Se você estiver na última linha desed
entrada da impressora, imprima (o espaço do padrão)."
h
significa "colar o conteúdo atual do 'espaço padrão' no 'espaço de espera', substituindo o que estiver lá".
n
significa "substituir o conteúdo do 'espaço padrão' pela próxima linha da entrada".
G
significa "anexado ao 'espaço padrão': uma nova linha seguida pelo conteúdo do 'espaço reservado'."
Tomados em conjunto, o sed
comando armazena quatro linhas de saída, revertendo-as à medida que as armazena e depois as imprime. Os $p
comandos adicionados na segunda versão garantem que, se a última linha do arquivo for alcançada, exceto em um múltiplo de 4 linhas, as linhas ainda serão impressas.
Para uma abordagem alternativa e interativa, ainda sem o uso de recursos específicos do Vim e também sem o uso de um filtro externo:
:4
para ir para a quarta linha.
:.m -4 | +3m . | +2m . | +5
para inverter as quatro linhas anteriores (1-4) e deixar o cursor na linha 8.
.m -4
move a linha atual para logo após a linha quatro linhas para trás (deixando o cursor na linha movida).
+3m .
move a linha que está 3 linhas após a linha atual, para logo após a linha atual, deixando o cursor na linha movida. +2m .
claro que funciona da mesma maneira.
+5
coloca o cursor cinco linhas abaixo de onde está.
Repita conforme desejado.
No Vim, você pode repetir todo esse comando com @:
e depois repetir com @@
. No POSIX vi
ou ex
você precisaria inserir :.m -4 | +3m . | +2m . | +5
como uma linha de texto, exclua-o em um buffer nomeado (registrador) e execute esse buffer nomeado (registrador).
Portanto, no ex
modo, revertendo linhas interativamente usando apenas os recursos especificados no POSIX e começando com 17 linhas de texto:
Entering Ex mode. Type "visual" to go to Normal mode.
:0a # Append following text after "line 0" (i.e. insert at start of file).
.m -4 | +3m . | +2m . | +5
. # End text insertion
:d k # Delete that line to register k
line1 # This is a printout of the current line
:4 # Move to line 4
line4
:@k # Execute register k to reverse lines 1-4
line8
:@@ # Execute register k again
line12
:@@ # Execute register k again
line16
:@@ # Execute register k again
line17
:%p # Print the whole buffer (just to see what was done)
line4
line3
line2
line1
line8
line7
line6
line5
line12
line11
line10
line9
line16
line15
line14
line13
line17
:wq # Save and quit
Leitura adicional: