我想在模式后面的第三行插入一行。示例: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
答案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
-- 将文件写回磁盘并退出。