首页 > 解决方案 > 使用 awk 在一些正则表达式之前打印第 N 条记录

问题描述

我有 awk 命令,它正在查找“匹配”并 在其后添加 5 行“字符串” :

awk '1;/match/{c=5}c&&!--c{print "string"}'

如何修改它以添加“字符串” N行,但在“匹配”之前

例如,我有一个 test.txt 文件:

one
two
three
four
five
six
seven
eight
nine
ten

使用我的命令,我可以拥有:

cat test.txt | awk '1;/six/{c=2}c&&!--c{print "addedstring"}'
one
two
three
four
five
six
seven
addedstring
eight
nine
ten

所以我需要修改我的命令,在六行之前添加addedstring 2 行:

one
two
three
four
addedstring
five
six
seven
eight
nine
ten

标签: awk

解决方案


作为替代方案,这可以使用命令行轻松完成vim

vim -e - file -c '/^six$/' -c 'norm kOaddedstring' -c 'wq'

或更易读的版本:

vim -e - file <<EOF
/^six$/
norm kOaddedstring
wq
EOF

然后检查文件内容:

cat file

one
two
three
four
addedstring
five
six
seven
eight
nine
ten

vim 命令解释:

  • /^six$/: 匹配仅six作为内容的行
  • norm kOaddedstring:进入normal命令模式。k向上移动一行并在当前行之前O插入文本addedstring
  • wq:保存并退出更改

推荐阅读