2015-09-22 81 views
0

我有幾個源文件,其功能定義如下。搜索多行正則表達式

ReturnType ClassName:: 
FunctionName(FunctionArgs...) 
{ 
.... 
} 

ReturnType ClassName::NestedClassName:: 
FunctionName(FunctionArgs...) 
{ 
.... 
} 

我想grep通過文件並單獨列出第一類型的所有功能和第一類型。有沒有辦法在emacs中做到這一點? 注:我已經從[https://emacs.stackexchange.com/questions/9548/what-is-regex-to-match-newline-character]嘗試了C-q C-j。它沒有工作。

回答

2

似乎有兩個相互關聯的部分:使用的正則表達式和搜索方法。我想提出以下假設(抱歉沒有事先明確這些,我沒有足夠的代表評論):

  1. 你有興趣收集只是函數簽名(前兩行),而不是裏面有什麼大括號。
  2. 冒號永遠不會出現在返回類型或類名中。
  3. 任何行都不會在函數體內的雙冒號中結束。

在Emacs,我可以區分兩種情況與正則表達式

^[^:]+::\n.+$ 
^[^:]+::[^:]+::\n.+$ 

(你會在一個交互式的使用與實際換行符(通過C-Q&A-J取代\n,例如))。

如果您已經在Emacs中打開了所有緩衝區,那麼現在就可以使用multi-occur。否則,您可以使用grep命令調出grep,或者使用M-!直接調用grep。

如果你使用grep,那麼你需要一種不同的方法(或者至少我找不到合適的正則表達式)。如果你放下第二行並使用-A 1開關(它告訴grep在每次比賽結束後打印行),一切似乎都正常。出於某種原因,您還需要轉義+運算符。下面是結果命令:

grep -A 1 "^[^:]\+::$" files 
grep -A 1 "^[^:]\+::[^:]\+::$" files