这是一个很好的答案。 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")
答案1
将变量命名already_inserted
为a
,这样就会变得清晰起来。然后它读起来像:
if my_pattern matches and not already_inserted { insert "some text"; already_inserted=true; }
awk
将为每一行运行此命令。
答案2
使用这些称为“标志变量”的变量,让程序知道满足了某个条件,然后根据其值决定进行进一步处理;这是一个简单的控制标志,只要它没有设置并且具有 0 或空值(在awk 默认变量的值进行整数比较时为 0,或者进行字符串比较时为空字符串),然后将打印字符串并a=1
设置标志,因此它将停止添加重复项,因为现在它是非零值。
在许多编程语言中,!
(not) 否定语句的求值结果,当它像 一样使用时! a
,它否定变量的求值结果a
, if a=0
,then! a
将返回 1,如果是 则返回 0 a=1
。