2

SQL スクリプト (つまり、Oracle の外部結合式) で "(+)" の出現箇所を見つける必要があります。「+」、「(」、および「)」はすべて特殊な正規表現文字であることを認識して、次のことを試しました。

grep "\(\+\)" *

現在、これは「(+)」の発生を返しますが、他の行も返します。(同じ行に開き括弧と閉じ括弧があるものは何でも見えるようです。)括弧は拡張されたgrepだけに特別であることを思い出して、私は試しました:

grep "(\+)" *
grep "(\\+)" *

これらは両方とも、「()」を含む行のみを返しました。したがって、「+」をエスケープできないと仮定して、古いトリックを試しました。

grep "([+])" *

それはうまくいきます。非正規表現ツールで結果をクロスチェックしました。

質問: 「+」文字で何が起こっているのか正確に説明できる人はいますか? 「(+)」で一致させるためのより厄介な方法はありますか?

(cygwin grep コマンドを使用しています。)

編集:解決策をありがとう。-- そして今、Bruno が参照した GNU grep マニュアルによると、" " を基本\+式で使用すると、"+" にその拡張された意味が与えられ、したがって 1 つまたは複数の "(" の後に ") が一致することがわかりました。 "。そして、私のファイルでは常に「()」です。

4

2 に答える 2

10

GNU grep(Cygwinに含まれています)は、正規表現の2つの構文(基本と拡張)をサポートしています。grep基本的な正規表現を使用するegrepgrep -E、拡張正規表現を使用します。grepマニュアルとの基本的な違いは、次のとおりです。

?基本的な正規表現では+、メタ文字、、、、、、およびは特別な意味を失います。代わりに、バックスラッシュバージョン、、、、、、およびを使用してください。{|()\?\+\{\|\(\)

文字の通常の意味が必要なので( + )、次の2つの形式のいずれかが目的に合っているはずです。

grep "(+)" *       # Basic
egrep "\(\+\)" *   # Extended
于 2008-10-09T19:33:07.707 に答える
1

シェルがバックスラッシュを飲み込んでいるため、おそらくいくつかのバックスラッシュを追加する必要があります。

ETA: 実際、Cygwin で試してみたところ、grep "(+)"あなたが望むものには問題なく動作するようです。

于 2008-10-09T19:23:27.837 に答える