チートシートに\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 つまたは複数」の解釈を取りますが、他のものは異なる場合があります。
脚注:
- つまり、
grep仕様、およびBRE および ERE 仕様(grep仕様がリンクおよび参照するもの) です。に渡される実際の引数をシェルが決定するため、シェル仕様も関連しgrepます。