Tente:
awk 'FNR==NR{a[FNR]=$0; next} NR<=length(a)+FNR{b[FNR]=$0; next} {for (i=1;i<=length(a);i++) gsub(a[i], b[i])} 1' file2 file1 file3
Por exemplo:
$ awk 'FNR==NR{a[FNR]=$0; next} NR<=length(a)+FNR{b[FNR]=$0; next} {for (i=1;i<=length(a);i++) gsub(a[i], b[i])} 1' file2 file1 file3
aws ec2 create-tags --region us-east-1 --resourcesi-XXXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_1
aws ec2 create-tags --region us-east-1 --resourcesi-XXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_2
Como funciona
-
FNR==NR{a[FNR]=$0; next}Isto salva todas as linhas no arquivo2 no array
a.FNR é o número de linhas lidas no arquivo atual. NR é o número de linhas lidas no total. Assim, se
FNR==NR, estamos lendo o primeiro arquivo nomeado,file2.a[FNR]=$0adiciona a linha atual, denotada$0, na matrizasob a chave FNR.O comando
nextdiz ao awk para ignorar os comandos restantes e recomeçar na linhanext. -
NR<=length(a)+FNR{b[FNR]=$0; next}Isso salva todas as linhas do arquivo1 no array
b.Aqui, usamos um teste semelhante,
NR<=length(a)+FNR, para determinar se estamos lendo o segundo arquivo.b[FNR]=$0adiciona a linha atual, denotada$0, na matrizbsob a chave FNR.O comando
nextdiz ao awk para ignorar os comandos restantes e recomeçar na linhanext. -
for (i=1;i<=length(a);i++) gsub(a[i], b[i])Se chegarmos aqui, estamos lendo o terceiro arquivo. Isso substitui qualquer texto que corresponda a uma linha no arquivo2 pelo texto correspondente do arquivo1.
O loop
for (i=1;i<=length(a);i++)faz um loop sobre o número da linha de cada linha na matriza.gsub(a[i], b[i])substitui qualquer ocorrência de textoa[i]pelo textob[i].Observe que o texto no arquivo2 é tratado como uma expressão regular. Se você precisar ter algum caractere regex ativo nesse arquivo, ele deverá ter escape.
-
1Esta é a senha curta do awk para imprimir a linha.