我如何评论(#)sed中匹配模式之前和之后的6行

jos*_*shy 1 regex vim perl sed

我想在匹配模式之前和之后评论(#)6行.我提到了这个问题.

如何使用sed删除匹配的行,上面的行和下面的行?

我尝试使用保持缓冲区来解决此问题,但无法正常工作.

我在文件中多次出现以下序列:

aaaa  
bbbb  
cccc  
dddd  
eeee  
ffff  
gggg  
hhhh  
iiii  
jjjj  
kkkk  
llll  
mmmm  
nnnn  
oooo  
Run Code Online (Sandbox Code Playgroud)

如果我搜索了hhhh,那么输出文件应该在下面给出:

  aaaa  
  #bbbb  
  #cccc  
  #dddd  
  #eeee  
  #ffff  
  #gggg  
  #hhhh  
  #iiii  
  #jjjj  
  #kkkk  
  #llll  
  #mmmm  
  #nnnn  
  oooo  
Run Code Online (Sandbox Code Playgroud)

请帮我用sed或任何其他脚本执行此操作!

rom*_*inl 12

这个问题被标记为Vim,所以...我心爱的人:help :global,:help :normal还有救援人员!

:g/hhhh/-6,+6norm I#
Run Code Online (Sandbox Code Playgroud)

:substitute 变种:

:g/hhhh/-6,+6s/^/#
Run Code Online (Sandbox Code Playgroud)

分解:

  • :global命令用于为与给定模式匹配的每一行执行Ex命令.

    :g/hhhh/d将删除包含的每一行hhhh.

  • Ex命令通常接受可选范围.范围可以使用绝对行号5,15和/或相对行号-3,+41.

    :g/hhhh/-6,+6d将删除上面6行和每行包含6行之间的所有内容hhhh.

  • :normal命令允许我们从命令行执行常规命令,并接受范围,就像其他Ex命令一样.I##在行的开头插入一个最简单的方法,所以我们可以:normal I#从命令行执行,这将我们带到第一个解决方案:

    :g/hhhh/-6,+6norm I#
    
    Run Code Online (Sandbox Code Playgroud)
  • 作为Ex命令,:substitute也接受一个范围,因此我们也可以使用它#在该范围内的每一行的开头插入一个,这将我们带到第二个解决方案:

    :g/hhhh/-6,+6s/^/#
    
    Run Code Online (Sandbox Code Playgroud)