1

我想打印文件中第 m 个第 n 个匹配模式之间的所有行。假设 m 为 10,n 为 90,在 VIM 中我执行以下操作:

/pattern  
gg
100n
jdG
gg
10n
kdgg

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

4

3 回答 3

2

一种简单的方法:

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

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

于 2013-03-07T17:24:53.700 回答
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

于 2013-03-07T18:06:27.677 回答
0
sed '10,90!d' file.txt

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

sed '1,9!d' file.txt > newfile.txt
于 2013-03-07T17:35:20.267 回答