我想在文件中打印 mth 和 nth 匹配模式之间的所有行。让我们说m是10而n是90,在VIM中我做了:
/pattern
gg
100n
jdG
gg
10n
kdgg
我如何使用sed或grep执行此操作。我希望操作文件而不在Windows中打开它。我尝试使用带有-c选项的vimscript,但遇到了一些问题。我们可以在vimscript中执行此操作而无需在窗口中打开文件吗?我想使用这部分(截断文件)作为shell脚本的一部分。我
答案 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