明らかな不一致にもかかわらず、Grepは引き続き

明らかな不一致にもかかわらず、Grepは引き続き

すべて同じパターンを持つ行を含むファイルがあります。

Word word word word,more words here,0-9 more words here

最初のカンマの前の最初の単語セットに20文字以上の文字を含む行を探したいと思います。私は書いた

cat file.txt | grep -E "^[A-Z,a-z,[:space:]]{20,}[,]{1}"

私はこれが新しい行記号を見つけて、20文字以上の一連の単語を見つけて、カンマを見つけて停止すると思います。それ以降の単語は改行がないため計算されません。

ただし、これはカンマの後の2番目の単語文字列とも一致します。なぜですか?

助けてくれてありがとう。

ベストアンサー1

[A-Z,a-z,[:space:]]Aとの間のZロケールソート順にソートされたソート要素(複数の文字である可能性があります)と一致するか、文字、および間にソートされた文字、またはロケール,でソートされた空白文字。az,

,を除くすべての文字を一致させる[^,]には単語文字またはスペースで区切られた文字を一致させるにはです(perl正規表現に対応する[[:alpha:][:space:]]に追加できます)。 ASCII文字またはASCIIスペースを一致させるには、シェルがサポートしている場合は1です。_[\w\s]$'...'$'[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz \t\r\f\v]'

だから:

<file.txt grep -E '^[^,]{20,},'

20以上の非文字,で始まり、それに続く行と一致します,

grep(名前は in コマンドから引用) パターンに一致する行を印刷します。この行の一致する部分だけを印刷するには、一部の実装でこのオプションを追加できます(元のGNUで)。一部は、カラーサポート端末に送信されたときに一致する部品を別の色で印刷することもできます。g/regular expression/pedgrep-ogrep

ただし、-o/を使用している場合、--color正規表現grepは複数回一致しようとし、前の一致が終了した後に行部分で検索が繰り返されます。一部の実装grepでは、これを正しく実行しないことがわかります。たとえば、grepast-openを使用すると、次のようになります。

$ echo aaa | grep -o '^a'
a
a
a

aこれは、行の先頭で検索してから、行の残りの部分^aに正規表現を適用して、より多くの一致を探すためです。aaGNUとbusyboxにはgrepこの問題はありません。

(これはcatファイルをリンクするコマンドなので、catここでは必要ありません。)


1 ASCIIと改行別名\n改行文字は^J通常空白に分類されますが、行区切り文字であるため、行の内容には表示されず、パラメータに特別な意味を持ち、行に入る複数の正規grep表現を区切るために使用できます。だからここに含めたくありません。

おすすめ記事