代码之家  ›  专栏  ›  技术社区  ›  nagarajan

如何复制匹配块并使用vim上的正则表达式写入另一个文件?

  •  0
  • nagarajan  · 技术社区  · 11 年前

    我有一套 code 块。我需要复制所有 密码 阻止该文件并写入另一个文件。

    例如:

    我当前的文件内容是:

    当前文件.txt

    * The method `make:` retrieves the prototype and clones it:
    
    ```cpp
    make: partName
        ^ (partCatalog at: partName) copy
    ```
    
    * The concrete factory has a method for adding parts to the catalog.
    
    ```cpp
        addPart: partTemplate named: partName
        partCatalog at: partName put: partTemplate
    ```
    
    * Prototypes are added to the factory by identifying them with a symbol:
    
    ```cpp
        aFactory addPart: aPrototype named: #ACMEWidget
    ```    
    

    从当前文件中,我只需要复制代码块并创建另一个文件,而不需要更改当前文件。

    预期输出文件为

    输出文件.cpp

    make: partName
        ^ (partCatalog at: partName) copy
    
    
        addPart: partTemplate named: partName
        partCatalog at: partName put: partTemplate
    
    
        aFactory addPart: aPrototype named: #ACMEWidget
    

    为了匹配我的代码块,我在vim上使用了以下正则表达式 :%s/```cpp\n\(.*\n\)\{-}```//gc 请帮忙解决我的问题。提前感谢。。。

    2 回复  |  直到 11 年前
        1
  •  1
  •   Zaboj Campula Massimiliano Peluso    11 年前

    可以通过命令写入范围

    :g/^```cpp$/+1;/^```$/-1 w!>> filename
    

    结果将与您在示例中所写的不完全相同,因为该示例包含源文件中不存在的额外空行。

        2
  •  1
  •   netblognet    11 年前

    可以使用pcgreep的组合(因为普通grep不支持多行匹配)。

    pcregrep -Mo1 '```cpp\n((.|\n)*?)```' input.cpp > output.cpp
    

    上述命令将从名为input.cpp的文件中获取源代码,并将清理后的源代码写入名为output.cpp的文件夹中。

    说明:

     //This matches the codeparts from your input file
     //whereby: -M is multiline, -o1 is first capturegroup => ((.|\n)*?)
     pcregrep -Mo1 '```cpp\n((.|\n)*?)```' input.cpp
    
    
     //This writes the cleaned text to output file
     > output.cpp