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

jia*_*ian 3 awk

这是一个很好的答案。 /sf/answers/471752921/ 但我还是有点困惑。

没有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
Run Code Online (Sandbox Code Playgroud)

尝试了几种组合后,我发现我必须使用 awk '/^nameserver/ && !a { printf("nameserver 127.0.0.1\n"); a=1 } {print}' file2

但我仍然对停止重复的功能!a感到困惑。a=1printf("nameserver 127.0.0.1\n")

pLu*_*umo 7

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

if my_pattern matches and not already_inserted { insert "some text"; already_inserted=true; }
Run Code Online (Sandbox Code Playgroud)

awk将为每一行运行此命令。


αғs*_*нιη 6

使用这些称为“标志变量”的变量,让程序知道满足了某个条件,然后根据其值决定进行进一步处理;这是一个简单的控制标志,只要它没有设置并且具有 0 或空值(在awk中,进行整数比较时默认变量的值为 0 或进行字符串比较时为空字符串),则将打印该字符串并显示该标志a=1将被设置,因此它将停止添加重复项,因为现在它是非零值。

在许多编程语言中,!(not) 否定语句的求值结果,当它像 一样使用时! a,它否定变量的求值结果a, if a=0,then! a将返回 1,如果是 则返回 0 a=1