AWK 在第一个匹配后插入行,如果下一行不是模式则插入空行

AWK 在第一个匹配后插入行,如果下一行不是模式则插入空行

我有以下类似更改日志的文件

#1.2.3

#InsertPart

#1.2.2

或者

#1.2.3

#InsertPart

- something

#1.2.2

期望的输出是

#1.2.3

#InsertPart

- new inserted line

#1.2.2

或者

#1.2.3

#InsertPart

- new inserted line
- something

#1.2.2

我可以使用以下脚本在 #InsertPart 之后插入一行

awk '1;!inserted && /# InsertPart/{c=2}c && !--c{print "- new inserted line"; inserted=1}'

#x.x.x但只有当模式位于下一行时,我才坚持插入空行。所以我以以下输出结束

#1.2.3

#InsertPart

- new inserted line
#1.2.2

答案1

我认为问题在于您首先打印该行,然后决定进行其他处理,而不是先执行插入操作然后打印该行。

您想要在魔术标记之后插入新内容 2 行,并且如果该行以 开头,您还想在其中添加一个空行#

awk '/#InsertPart/ { c = 3 }
     --c == 0 { print "- new inserted line" }
     c == 0 && /^#/ { print "" }
     {print $0}'

我以直接的方式编写代码,而不是最短的方式(例如“{print $0}”而不是“1”),以使其更清晰。递减--c == 0c 并将 c 的新值与 0 进行比较。

答案2

试试这个

awk -v line='- new inserted line' '/#InsertPart/ {printf "%s\n\n%s\n", $0, line; next}; 1' yourfilename

相关内容