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]=$0
adiciona a linha atual, denotada$0
, na matriza
sob a chave FNR.O comando
next
diz 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]=$0
adiciona a linha atual, denotada$0
, na matrizb
sob a chave FNR.O comando
next
diz 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.
-
1
Esta é a senha curta do awk para imprimir a linha.