2017-12-12 6 views
1

に置き換える:複数行モードの検索と(多数のファイル内に含まれる)入力の次の型を考えるとperlの

ret = myFunc(&pConfig->hConstraintList, &pConfig->util, 
        2, sizeof(rcConstraint_t), 
        NULL, NULL, NULL, NULL, NULL); 

を私は、次の正規表現が一致して取得しようとしている:

myFunc\((\S*)\s*(\S*)\s*(\S*)\s*(\S*)\s*(\S*?),\s*NULL,\s*NULL,\s*NULL,\s*NULL\s*\).*; 

これは.NETの正規表現として機能しますが、ファイルの検索と置換を行います。 Powershellでは痛みがあり、VS UIは複数行の式を完全にサポートしていません。

So ... perl。しかし、私も試合を動作させることはできません。

は、ここで私が試したものです:

perl -0ne '/myFunc\((\S*)\s*(\S*)\s*(\S*)\s*(\S*)\s*(\S*?),\s*NULL,\s*NULL,\s*NULL,\s*NULL\s*\).*;/gms' myfile.cpp 

私の仮定はperlがさえ複数行モードで改行空白を考慮していないということでしょうか?それは、各パラメータが任意の数のスペース、タブ、改行をそれらの間の任意の順序で持つことができるので、完全な悪夢になるでしょう。

私は、正直であるように動作するすべてのソリューションに興味があります。ここには多くの変数があります。私はこの特定のファイルについて、その潜在的な問題を解消するためにperl -pi -e 's/\r//g'を実行しましたが、私は\rでも同様にチョークしない解決策が大好きです。

PS - 私はgoogleがこの質問を検索し、stackoverflowで検索しました。問題は、「複数行」を使用するほとんどの人が複数の行を1つずつ検索するだけで済むということです。正しく使用している人は、私が手助けしてくれない、まったく異なるパターンを持っています。私を助ける答えがあれば、それを見つけることができませんでした。

答えて

3

/m修飾子は、正規表現で使用していない^および$の動作を変更するため、変更する必要はありません。

同じことが/sに適用されます。.は改行にマッチしますが、必要はありません。\sは改行を含むすべての空白に既に一致しています。

私は正規表現でカンマをリストし、最後に.*を省略することができます(/s)ので、残りのドキュメントと一致します。

perl -0pe 's/myFunc\((\S*),\s*(\S*),\s*(\S*),\s*(\S*),\s*(\S*?), 
      \s*NULL,\s*NULL,\s*NULL,\s*NULL\s*\) 
      /myFuncNoCB($1, $2, $3, $4)/xg' -- file 
+0

これはすばらしいと思いますが、私がもっとうまくいく可能性があることについての説明をいただきありがとうございます。私の正規表現が一致しない原因となっていたものを見たことがありますか? – zzxyz

+1

あなたは、より多くの助けになるために、あなたがマッチさせたいもの(またはマッチさせたくないもの)の例をもっと必要とします。 – choroba

+1

@zzxyx:空白以外のフィールドはおそらく '\ S +'でなければなりません。なぜなら、それらのすべてが何も一致しないと意味がないからです。 – Borodin

関連する問題