0

私は複数行の一致のために拡張機能を使用 grepしていperlますが、すべての一致の行番号は最初の複数行の一致の行数に依存することがわかりました!

関数startを見つけるためのgrep正規表現:c

   grep -iPn '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$'

私は例でよりよく説明することができます:

これらの2つの関数がソースファイルに存在するとします

      int f1(int a) {       

      int 
      f2 (int b )        
      {

この場合、grepは正規表現と正常に一致し、stdoutに出力される行番号はソースファイルの行番号と同じです。

この問題は、複数行の関数が最初に来るときに発生します。これにより、行番号の出力が変更され、しばらくの間ファイルを調べた後、結論に達しました。複数行の関数は一致しますが、grepによって単一の行として読み取られるため、関数全体に単一の行番号が割り当てられます。関数に続く次の行は、行数に応じて行番号が短くなります。を占めます。

私のファイルには多数の複数行C関数があり、それぞれの行番号が大きくずれています。

これを修正する方法はありますか?

4

2 に答える 2

3

Using the pcregrep for the same regex shows the correct line number !

 pcregrep -Mni '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$'
于 2012-06-27T16:10:45.817 に答える
0

あなたのソリューションは私の(linux、gnu)grepでは動作しません。

それを機能させるために追加-zする必要があります。-zを使用すると、「行」はnull文字で区切られます。このように、単一の「行」があるので、行番号は機能しません:(しかし、バイトオフセットは機能します。時にはそれで十分です...

したがって、grepを使用します。

grep -ziPbo '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$'

取得する

24:int 
f2 (int b )        
{
于 2015-03-12T19:44:44.337 に答える