Para copiar todas as linhas entre% packages e% end de file1 para file2:
awk '$1=="%end" {f=0;next} f{print;next} $1=="%packages" {f=1}' file1 >>file2
Esta solução foi projetada para remover as linhas% packages e% end. (Se você quiser que essas linhas sejam transferidas também, existe uma solução ainda mais simples abaixo.)
Como awk
implicitamente percorre todas as linhas de um arquivo, os comandos acima são aplicados a cada linha em file1
. Ele usa um sinalizador, chamado f
, para determinar se estamos na seção de pacotes de file1
. Cada linha dentro da seção de pacotes é impressa no stdout que é redirecionado para file2
.
Vamos considerar os comandos awk
, um por um:
-
$1=="%end" {f=0;next}
Este comando verifica se a linha começa com
%end
. Em caso afirmativo, o sinalizadorf
é definido como zero e passamos para a linhanext
. -
f{print;next}
Este comando verifica se o sinalizador
f
é diferente de zero. Se for diferente de zero, a linha será impressa e passaremos para a próxima linha. -
$1=="%packages" {f=1}
Este comando verifica se a linha começa com
%packages
. Se assim for, define o sinalizadorf
para um, para que as linhas depois disso sejam impressas.
Incluindo as linhas dos marcadores:
O acima exclui as linhas de marcação% packages e% end. Se você quiser aqueles incluídos, use:
awk '/^%packages/,/^%end/ {print}' file1 >>file2