AWK/SED/GREP - 第 N 次匹配后打印 M 行

AWK/SED/GREP - 第 N 次匹配后打印 M 行

我希望在 N 次匹配后显示 M 行。实际上,我需要这样做才能将包含 N 次匹配且<regex>后面总是跟有 M 行的文件拆分为 N 个不同的文件。我在 BSD Unix 下。

xyz
<regex>
aa
bb
cc
xyz
<regex>
dd
ee
ff

我想要获得的应该是:

aa
bb
cc

dd
ee
ff

目前,我可以正确地打印 M 行,<regex>包括

for i in `seq 1 n`; do awk -v n=$i '/<regex>/ && !--n { print ; for(m=1; m<=3; m++) { getline ; print } }' inputfile > outputfile; done

我会很感激任何建议,以及任何使用 sed/grep 管道的简单解决方案。如果能提供一些额外的文字来解释建议的命令是如何工作的,我会非常感激!谢谢!

答案1

使用您的示例文件,这是否可以实现您想要的效果:

$ cat demo.sh
#!/bin/bash

INFILE="./infile"
COUNT=2
OUTFILE_PREFIX="XXX"

sed -n '/regex/,+'${COUNT}' { p; }' ${INFILE} | split -l$((++COUNT)) - ${OUTFILE_PREFIX}

$ ./demo.sh
$ ls XXX*
XXXaa  XXXab
$ cat XXX*
<regex>
aa
bb
<regex>
dd
ee
$

相关内容