「a」で始まり、少なくとも1 c、2 cs以下の単語でgrepしようとしました。grep特定の要素名の使用方法
は、だから何私がいた:、acost、正確、アカシアを非難よう
grep '^ac{1,2}' place/file/input.txt > place/file/output.txt
は、その言葉のための真の言うことを仮定しませんか?しかし、私がアサーションを実行すると、Falseは真ではないと言います。
ここで私が無視していることを教えてください。
「a」で始まり、少なくとも1 c、2 cs以下の単語でgrepしようとしました。grep特定の要素名の使用方法
は、だから何私がいた:、acost、正確、アカシアを非難よう
grep '^ac{1,2}' place/file/input.txt > place/file/output.txt
は、その言葉のための真の言うことを仮定しませんか?しかし、私がアサーションを実行すると、Falseは真ではないと言います。
ここで私が無視していることを教えてください。
デフォルトでは、パターンは標準的な "拡張"正規表現構文を受け入れません(私の最初の書き方が間違っていたことを指摘してくれた3人のおかげで)。あなたはegrep
または-E
で拡張されたパターンを有効にすることができます。
grep -E '^ac{1,2}' place/file/input.txt > place/file/output.txt
-E
マッチを拡張正規表現を使用しています。 IEEE Std 1003.1-2001、第9.4項拡張正規表現の基本定義ボリュームに記載されているように、指定された各パターンをEREとして扱います。 EREパターン全体が終端を除く入力行の一部と一致する場合、その行は一致しなければならない。 null EREはすべての行に一致しなければなりません。 POSIXドキュメントしかし、3個のC年代から
は1または何か他のものに続いて2でもあるので、あなたは、次の文字が交流ではないことを確認したいと思います:
grep -E '^ac{1,2}[^c]' place/file/input.txt > place/file/output.txt
さらに、James Brownが指摘しているように、多くの文字をエスケープしてgrep
が-E
を除いて必要に応じて正規表現を処理できるようにすることができます。
まずいくつかのテスト材料:
$ cat file
a # miss
ac # miss without this comment
acc # miss without this comment
accc # miss
accd # hit
あなたは{}
S(および?+|()
複数可)をエスケープする必要があります。
$ grep 'ac\{1,2\}[^c]' file
accd
または
$ grep 'acc\?[^c]' file
accd
(...または使用説明した拡張パターンin the other answer)。
これは間違っています。 'grep'は、正規表現のマッチを印刷する能力から、まさにその名前を得ています。違いは、従来の正規表現と拡張正規表現の違いです。後で正式に定義され、POSIXによってBREやEREにいくらか拡張されました。さらに多くの正規表現方言があります。特にPCREは多くの現代的なプログラミング言語でよく知られています(いくつかのプラットフォームでは 'grep -P 'でサポートされています)。 – tripleee
より広い歴史的な見通しについてはhttps://stackoverflow.com/questions/11856054/bash-easy-way-to-pass-a-raw-string-to-grep/11857890#11857890を参照してください。 – tripleee
@tripleee明らかにあなたは正しいです、私の汚れを指摘してくれてありがとうございます。 –