Esta é uma ótima resposta. https://stackoverflow.com/a/6739327/15603477 Mas ainda me confundiu um pouco.
sem a
variável, awk '/^nameserver/ { printf("nameserver 127.0.0.1\n")} {print}' file2
obterá:
# Generated by NetworkManager
domain dhcp.example.com
search dhcp.example.com
nameserver 127.0.0.1
nameserver 10.0.0.1
nameserver 127.0.0.1
nameserver 10.0.0.2
nameserver 127.0.0.1
nameserver 10.0.0.3
Depois de tentar a combinação de serval, descobri que tinha que usar
awk '/^nameserver/ && !a { printf("nameserver 127.0.0.1\n"); a=1 } {print}' file2
Mas ainda estou confuso com !a
a a=1
função de parar a printf("nameserver 127.0.0.1\n")
duplicação.
Nomeie a variável
already_inserted
em vez dea
e ficará claro. Então lê-se assim:awk
irá executar este comando para cada linha.o uso desse tipo de variável conhecida como "variável sinalizadora", que permite ao programa saber que uma determinada condição foi atendida e decidir com base em seu valor para processamento posterior; aqui é um sinalizador de controle simples que sempre que não for definido e tiver 0 ou valor vazio (no awk o valor das variáveis padrão é 0 ao fazer comparação de inteiros ou sua string vazia ao fazer comparação de strings), então a string será impressa e o sinalizador
a=1
será definido e, portanto, interromperá a adição de duplicatas, pois agora é um valor diferente de zero.Em muitas linguagens de programação,
!
(not) nega o resultado da avaliação de uma instrução que, quando usada como! a
, nega o resultado da avaliação daa
variável, ifa=0
, então! a
retornará 1 ou retornará 0 se fossea=1
.