Oi suponho que eu tenho um arquivo que se parece com:
x
x
x
A
B
C
1
2
3
D
E
F
x
x
x
e como precisam que os arquivos se pareçam:
x
x
x
A
B
C
D
E
F
1
2
3
x
x
x
Eu sei que poderia fazer isso com algumas sed -i s/search/replace/g
linhas, mas estou querendo saber se há uma maneira melhor e mais fácil de mover o x
número de linhas por y
números em qualquer direção?
ed
Usando
sed
(movendo as linhas para baixo, porque é mais fácil com os editores de fluxo):Você pode ler o
sed
script como "mover as linhas 7 a 9 para depois da linha 12".O script anotado:
Como as linhas podem ser endereçadas por expressões regulares (não apenas números de linha), o seguinte também funcionaria (nestes dados específicos):
Ou seja, "mova as linhas da que começa com
1
até a que começa com3
e depois da linha que começa comF
".Uma tradução direta do acima para
awk
:Usando "números de linha" (registre os números em
awk
):A condição
NR == 7, NR == 9
também pode ser escritaNR >= 7 && NR <= 9
.Para ser 100% fiel ao
sed
código, o segundo bloco deve ser lido{ $0 = $0 ORS hold; sub(ORS, "", $0) }
, mas é um pouco bobo inserir o separador de registro de saída (uma nova linha por padrão) apenas para removê-lo imediatamente depois.Para substituir o arquivo original pelo resultado dos comandos acima:
ou a mesma coisa com o
awk
comando.Isso deixaria o arquivo original inalterado se o arquivo de entrada de
sed
/awk
não pudesse ser lido ou se o arquivo de saída não pudesse ser gravado.