Como faço para trocar dois grupos de linhas em um arquivo .sql?

1

Eu tenho um arquivo de despejo com várias instruções INSERT . O arquivo parece algo como

start_lines

INSERT INTO table1234 …
INSERT INTO table1234 …
INSERT INTO table1234 …

INSERT INTO table7890 …
INSERT INTO table7890 …
INSERT INTO table7890 …

 end_lines

Preciso que todas as instruções INSERT INTO table7890 fiquem acima das instruções INSERT INTO table1234 . Gostaria de manter todos os start_lines e end_lines na mesma posição em que estavam antes de a mudança ocorrer. Assim, por exemplo, se o start_lines ocupar as linhas 3 a 18, depois de alternar as instruções de inserção, elas devem continuar aparecendo de 3 a 18. Idem para as linhas finais.

Como faço para alternar os grupos de instruções?

    
por Dave 30.12.2016 / 04:18

2 respostas

1

A abordagem mais simplista é ler o arquivo duas vezes, a primeira vez que você salva os parágrafos e a segunda vez que você os troca, por exemplo, com awk (no modo de parágrafo):

awk -v RS= -v ORS='\n\n' 'NR==FNR{
if (/table1234/) {one=$0} else if (/table7890/){two=$0}
next
}
{
if (/table1234/) {$0=two} else if (/table7890/){$0=one}
}
1' infile infile

Isso imprimirá uma linha vazia à direita, se isso for importante ...

Outra maneira com ol ' ed que funciona nesse caso específico:

ed -s infile <<\IN
g/INSERT INTO table1234/d
-1r !grep -F 'INSERT INTO table7890' infile
+1,$g/INSERT INTO table7890/d
-1r !grep -F 'INSERT INTO table1234' infile
,p
q
IN
    
por 30.12.2016 / 20:06
0

Existem várias maneiras de fazer isso, mas o mais simples que posso ver é com grep :

grep -v table1234 test.sql; grep table1234 test.sql

Você começa com a saída de tudo, exceto table1234 linhas, e depois de gerar apenas table1234 linhas.

Se você quiser, também pode redirecioná-lo para um novo arquivo:

(grep -v table1234 test.sql; grep table1234 test.sql) > test2.sql
    
por 30.12.2016 / 05:28