如何使用 awk 在文件中间添加一行文本?

如何使用 awk 在文件中间添加一行文本?

这是一个很好的答案。 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=1printf("nameserver 127.0.0.1\n")

答案1

将变量命名already_inserteda,这样就会变得清晰起来。然后它读起来像:

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

相关内容