这是一个很好的答案。 https://stackoverflow.com/a/6739327/15603477 但我还是有点困惑。
没有a
变量,awk '/^nameserver/ { printf("nameserver 127.0.0.1\n")} {print}' file2
将得到:
# 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
在尝试了薮猫组合后,我发现我必须使用
awk '/^nameserver/ && !a { printf("nameserver 127.0.0.1\n"); a=1 } {print}' file2
但我仍然对阻止重复!a
的功能感到困惑。a=1
printf("nameserver 127.0.0.1\n")
命名变量
already_inserted
而不是,a
它将变得清晰。然后它看起来像:awk
将为每一行运行此命令。使用这种称为“标志变量”的变量,让程序知道某个条件已经满足,然后根据其值来决定进一步处理;这是一个简单的控制标志,只要它没有设置并且具有 0 或空值(在awk 中,默认变量的值在进行整数比较时为 0,或者在进行字符串比较时为空字符串),然后将打印字符串并标记
a=1
将被设置,因此它将停止添加重复项,因为它现在是非零值。在许多编程语言中,
!
(not) 否定语句的评估结果,当它使用 like 时! a
,它否定a
变量的评估结果,如果a=0
,! a
则将返回 1,如果是,则将返回 0a=1
。