
Quero substituir parte dos dados de um arquivo por dados de outro arquivo.
Suponha file1
que haja dados como estão escritos abaixo e file2
alguns dados que desejo armazenar e substituir file1
dados do file2
padrão inicial: // +++ CUSTOMIZATION SETTINGS START +++
e do padrão final: // +++ CUSTOMIZATION SETTINGS END +++
.
Em file1
:
ANJALI
NISHA
// +++ CUSTOMIZATION SETTINGS START +++
WE WILL BE ON LEAVE FOR TODAY
// +++ CUSTOMIZATION SETTINGS END +++
PREETI
MONA
Em file2
:
MANISH
MADHVI
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
NISHA
TUSHAR
Como file3
saída:
ANJALI
NISHA
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
PREETI
MONA
Responder1
$ awk '/SETTINGS START/,/SETTINGS END/ {if (FNR==NR) {a=a"\n"$0}} FNR==NR{next} /SETTINGS START/{print substr(a,2)} /SETTINGS START/,/CUSTOMIZATION SETTINGS END/{next} 1' file2 file1
ANJALI NISHA
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
PREETI MONA
Explicação
awk
percorre implicitamente os arquivos linha por linha. Nesse caso, fazemos um loop primeiro no arquivo2 e depois no arquivo1.
/SETTINGS START/,/SETTINGS END/ {if (FNR==NR) {a=a"\n"$0}}
A seção de configurações do arquivo2 é capturada na variável
a
.FNR==NR{next}
Se ainda estivermos lendo o arquivo2, pule o restante dos comandos e pule para a próxima linha de entrada.
/SETTINGS START/{print substr(a,2)}
Se chegarmos aqui, estamos processando o arquivo1. Quando virmos o início da seção de configurações, imprima a string que salvamos na variável
a
./SETTINGS START/,/CUSTOMIZATION SETTINGS END/{next}
Se estivermos na seção de configurações do arquivo1, pule o restante dos comandos e vá para a próxima linha de entrada.
1
1
é a abreviatura enigmática do awk para imprimir a linha atual. Só chegaremos a esta declaração se estivermos no arquivo1, mas não na seção de configurações.