在第m个和第n个匹配模式之间打印线

时间:2013-03-07 17:20:36

标签: sed grep vim

我想在文件中打印 mth nth 匹配模式之间的所有行。让我们说m是10而n是90,在VIM中我做了:

/pattern  
gg
100n
jdG
gg
10n
kdgg

我如何使用sed或grep执行此操作。我希望操作文件而不在Windows中打开它。我尝试使用带有-c选项的vimscript,但遇到了一些问题。我们可以在vimscript中执行此操作而无需在窗口中打开文件吗?我想使用这部分(截断文件)作为shell脚本的一部分。我

3 个答案:

答案 0 :(得分:2)

一个简单的方法:

awk '/pattern/{ count++ } count > m && count < n' input

如果在一条线上多次出现,这将只计算一次模式,但这很容易修复,并且不清楚在这种情况下你想要什么行为。

答案 1 :(得分:1)

我看到用vimscript标记的问题只是添加了这个答案。如果这里不合适,请发表评论,我会将其删除。

您的vim工作流程可简化为:(例如m=3,n=10

/pattern
3//,10//y x|%d|put x
  • 如果你想在vimscript中使用它,可以将它包装在一个函数中:

    function! CutIt(m,n)
        execute a:m.'//,'.a:n.'//y x|%d|put x'
    endfunction
    

然后你(仅/pattern:call CutIt(3,10)

之后
  • 如果您要保存/pattern步骤:

    function! CutIt(p,m,n)
        execute a:m.'/'.a:p.'/,'.a:n.'/'.a:p.'/y x|%d|put x'
    endfunction
    

然后你只需拨打:call CutIt('pattern',3,10)

如果你想以交互方式进行。比如说,键入一个映射键,然后输入pattern, m, n然后输入Enter让vim为你完成工作。你可以查看这个答案,如何在vim中接受用户输入: Remap key and get user input

答案 2 :(得分:0)

sed '10,90!d' file.txt

将第10行到第90行打印到STDOUT。要将输出发送到新文件,请使用

sed '1,9!d' file.txt > newfile.txt