【问题标题】:how to extract text that has already matched the multiple line pattern?如何提取已经匹配多行模式的文本?
【发布时间】:2011-07-12 13:00:13
【问题描述】:

全部 使用 vim 元字符 \_。或awk,我已经匹配了多行,但我不知道如何将它们拉出或提取到其他文件中。有没有一般的方法可以做到这一点?

【问题讨论】:

    标签: regex vim awk


    【解决方案1】:

    如果您在开始搜索,y//e<CR> 会将整个匹配的字符串复制到默认寄存器中。请注意,此操作后n 会将您带到当前搜索的末尾(因为保存了e 偏移标志),如果您希望n 继续将您带到开始,您应该另外输入//<CR> (清除所有偏移标志)。所以,整个按键序列是

    /<pattern><CR>y//e<CR>//<CR>N
    

    【讨论】:

    • 也许是明确的并使用//s 不会受到伤害。因此,为了完成您的答案,可以将其记录到宏中。
    【解决方案2】:

    只复制模式到另一个文件

    "between marks 
    :'a,'b g/^Error/ . w >> errors.txt
    
    "entire file
    :% g/pattern/ . w >> log.txt
    
    "to display "whit numbers", lines containing the desired pattern
    :g/pattern/#
    

    【讨论】:

    • 这没有回答问题。这些命令复制行,而不是多行模式!
    【解决方案3】:

    在 awk 中使用 print 然后将输出重定向到其他文件。

    awk 'BEGIN {FS =" "};  { if ($0 ~ /(expression)/) { print $0 } }' inputfile.txt > outputfile.txt
    

    【讨论】:

      【解决方案4】:

      这个答案适用于 Vim,而不是 Awk。

      我可以建议:

      function CopyPatternToRegisterZ(pat)
        let @z .= a:pat
        return a:pat
      endfunction
      

      然后:

      :let @z = ''
      :%s/your_pattern/\= CopyPatternToRegisterZ(submatch(0)) /g
      

      然后您可以使用"zp 将您的匹配项粘贴到另一个文件中。

      有关此语法的详细信息,请参阅:help sub-replace-expression

      【讨论】:

      • 不需要CopyPatternToRegisterZ()。请改用setreg('Z', submatch(0))。如果您想按行执行此操作,则 setreg('Z', submatch(0), 'l')
      • @Peter Rincker:setreg 是否返回寄存器的值?如果不是,更换可能会导致一些问题。
      • 成功时返回零,失败时返回非零。我现在明白你为什么创建自己的函数了。虽然在运行替换后一个简单的u 就可以达到效果。
      猜你喜欢
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多