awk:在遵循模式的 N 行之后插入行

awk:在遵循模式的 N 行之后插入行

我想在模式后面的第三行插入一行。示例:z在每个匹配项后插入单词3 行a

a 
b1
c1
d1


a 
b2
c2
d2

...

a 
b1
c1
z
d1


a 
b2
c2
z
d2

...

答案1

$ awk '/a/{c=1} (c++)==4{print "z"} 1' file
a
b1
c1
z
d1


a
b2
c2
z
d2

答案2

或者sed 插入/追加

sed '/^a/{n;n;n;i\z
}' FILE
sed '/^a/{n;n;a\z
}' FILE

答案3

类似的东西可以完成这项工作:

awk 'BEGIN {v1=-100} {if ($1=="a") v1=FNR;if (FNR-v1==3) print "z"; print $0}' input_file

该脚本检查记录是否为“a”并将变量设置为指向当前行。然后检查当前记录行减去上一个存储行是否等于3并打印字符串,然后打印当前行

答案4

您可以使用可编写脚本的编辑器ed来执行此操作:z在匹配后全局插入三行/a/

$ ed -s input-file
g/a/+3i\
z
wq

或者,作为一行:

printf '%s\n' 'g/a/+3i\' 'z' 'wq' | ed -s input-file

命令ed是:

  • g/a/+3i\-- 全局执行后续命令,即:匹配/a/后三行,插入一些文本。尾随反斜杠将插入命令继续到下一行。
  • z- 插入文本z。由于缺少尾部反斜杠,插入命令结束,完成全局执行。
  • wq-- 将文件写回磁盘并退出。

相关内容