3

ここで骨の折れることをしていることはわかっていますが、Unix/Linux クラスで提供された正規表現のチート シートには、(私の読みによると) 年 (0000 から 9999 までの数字) を含むテキスト ファイル内の行を見つける必要があることが暗示されていました。

grep \d{4} file.txt

代わりに何も見つからないのはなぜですか?これは bash を使用しており、Windows の PuTTY でも Mac のターミナルでも同じ結果になります。括弧と引用符を使用してバリエーションを試しましたが、効果はありませんでした。検索は機能します[0-9][0-9][0-9][0-9]が、何も期待どおりに機能していないようです\d{4}

関連するメモとして、単純に「機能しない」のに、なぜ.\+私が期待する効果があるの.+ですか? (grepに何か.+を探すように指示していることは知っていますが、何がわかりません。)つまり、「1文字の後にプラス記号が続く」ではなく、「ここに1文字以上」を要求する方法のようです。(これは課題を行う正しい方法であり、先生はその理由を私に説明することができました) そして、「1 文字の後にプラス記号が続く」をどのように検索しますか?

4

3 に答える 3

3

チートシートに\d{4}は、「4桁」を意味する有効な正規表現であると記載されている場合があります。grepまた、ファイルで正規表現を検索すると述べている場合があります。別々に考えると、これらのステートメントは両方とも真実です。しかし、まとめると、grep PATTERN FILEは 1 種類の正規表現 (POSIX「基本正規表現」、BRE) を想定しているのに対し、\d{4}は異なる種類の正規表現 (「Perl 互換正規表現」、PCRE と呼ばれることもある) からの表記であるため、非常に誤解を招く可能性があります。 、Perl プログラミング言語の後)。

の多くのバージョンは、パターンが BRE ではなく PCRE であることを示すフラグをgrepサポートしています。-Pあなたが試すことができます:

grep -P '\d{4}' file.txt

( を一重引用符で囲んでいることに注意してください。そうしないと、Bash がの一種の省略形として使用する\d{4}ため、これらが必要です。そのため、に渡される実際のパターンは、「4 桁」ではなく「4 」を意味します。別の方法として、次のこともできます。 write 、同じ問題を別の方法で解決します。)\d'd'grepd{4}dgrep -P \\d{4} file.txt


編集して追加:申し訳ありませんが、質問の 2 番目の部分について説明できませんでした+。したがって、関連する仕様によると、1これは次のとおりです。

grep .+ file.txt

「 NUL.以外の任意の文字」+を意味し、「実際のプラス記号」を意味します。file.txtしたがって、先頭以外のプラス記号を含む行を実際に出力する必要があります。異なる動作が見られる場合は、シェルおよび/またはgrep非準拠である必要があります。

さらに、これ:

grep .\+ file.txt

は上記と同じです。準拠している POSIX シェル (Bash など) は を\+凝った書き方として扱う+ためgrep、前と同じ引数が表示されます。(ではなく、grep入力したことを知る方法がありません。).\+.+

最後に、これ:

grep '.\+' file.txt

(\が実際に に渡される場所grep) は未定義の動作をします: 特定のgrep実装では、 と同じことを意味する.+か、\+「1 つ以上」(または他の何か) を意味する特別な表記法であると見なされるか、またはエラーメッセージを出します。GNU 実装は、たまたま「1 つまたは複数」の解釈を取りますが、他のものは異なる場合があります。

脚注:

  1. つまりgrep仕様、およびBRE および ERE 仕様(grep仕様がリンクおよび参照するもの) です。に渡される実際の引数をシェルが決定するため、シェル仕様も関連しgrepます。
于 2013-05-16T23:47:37.620 に答える
2

デフォルトでは、grep は を含まない POSIX 正規表現を使用します\d。式を使用するには、PCRE (arg -P) に切り替える必要があります。

grep -P \\d{4} file.txt 

これにより、file.txt 内の 4 桁の文字列のすべてのインスタンスが返されます。

于 2013-05-16T23:46:57.527 に答える