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 sinalizadorfpara 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