2017-10-03 1 views
0

「a」で始まり、少なくとも1 c、2 cs以下の単語でgrepしようとしました。grep特定の要素名の使用方法

は、だから何私がいた:、acost、正確、アカシアを非難よう

grep '^ac{1,2}' place/file/input.txt > place/file/output.txt 

は、その言葉のための真の言うことを仮定しませんか?しかし、私がアサーションを実行すると、Falseは真ではないと言います。

ここで私が無視していることを教えてください。

答えて

0

デフォルトでは、パターンは標準的な "拡張"正規表現構文を受け入れません(私の最初の書き方が間違っていたことを指摘してくれた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を除いて必要に応じて正規表現を処理できるようにすることができます。

+0

これは間違っています。 'grep'は、正規表現のマッチを印刷する能力から、まさにその名前を得ています。違いは、従来の正規表現と拡張正規表現の違いです。後で正式に定義され、POSIXによってBREやEREにいくらか拡張されました。さらに多くの正規表現方言があります。特にPCREは多くの現代的なプログラミング言語でよく知られています(いくつかのプラットフォームでは 'grep -P 'でサポートされています)。 – tripleee

+1

より広い歴史的な見通しについてはhttps://stackoverflow.com/questions/11856054/bash-easy-way-to-pass-a-raw-string-to-grep/11857890#11857890を参照してください。 – tripleee

+0

@tripleee明らかにあなたは正しいです、私の汚れを指摘してくれてありがとうございます。 –

2

まずいくつかのテスト材料:

$ 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)。

関連する問題