名前、姓、電話番号。以下はテキストです。
Hace, Apoio, 703-2101
Yoliot, Apostolos, 4222-1124
Jenny,Thano,105-4122
Heriom,Koun, 510-4122
Dekon, Atolo, 502-2522
Feow, R,685-3431
5文字のすべての姓を見つけたいです。
編集する:頑張った
egrep -i '[^:]+[a-z]5$' file2
しかし、これはうまくいきません
答え1
awk -F '[[:blank:]]*,[[:blank:]]*' 'length($2) == 5'
オプションで、スペースで囲むようにフィールド区切り記号を設定,
し、2番目のフィールドの長さは5行のレポート行です。
そしてgrep
:
grep -E '^[^,]*,[[:blank:]]*[^[:blank:],][^,]{3}[^[:blank:],][[:blank:]]*(,|$)'
しかし注意すべき点[^,]
は[^[:blank:],]
、要素の構成、ロケールによって必ずしも単一文字である必要はありません。たとえば、GNUシステムのチェコ語ロケールでは、次のように一致します。
Stéphane,Chazel,555-5555
Ch
そこに仕上げ要素があるからです。したがって、これら2つのカンマ()<Ch><a><z><e><l>
の間に5つの照合順序要素を見つけます。
GNUを使用すると、角括弧式が文字のみに一致するPCREの代わりにgrep
このオプションを使用できます。-P
-E
有効な文字を形成しないバイト列と一致しません。ファイルに書き込まれた文字が現在のロケールの文字セットと異なる文字セットである場合、問題が発生する可能性があります。たとえば、一致しません。
Stéphane,ABCDE,555-5555
現在のロケールは文字セットとしてUTF-8を使用していますが、é
iso-8859-1文字セット(0xe9バイト)で書かれている場合はé
一致しません[^,]
(無効なバイトシーケンスなので、以外の要素を照合します。,
)。
さらに、UTF-8ロケールでは、一部の文字が複数の文字で表示されることがあります。たとえば、é
上記の内容は、U + 00E9文字またはU + 0065文字(e
)の後にU + 0301(アクセントの組み合わせ)で表示できます。
文字/グリフを一致させるには、-P
and\X
演算子を使用して文字クラスタを一致させることができます。
grep -P '^[^,]*,\h*(?![\h,])\X((?!,)\X){3}(?![\h,])\X\h*(,|$)'
答え2
\sタグと\Sタグで "egrep"を使用してください。
egrep '^[^,]*,\s*\S{5},' file
- 最初のカンマを含む最初のフィールドをスキップし、
- 最初のカンマの後のスペースをスキップして、
- その後、5つの文字と一致し、その後にオプションのスペースとカンマが続きます。
答え3
次の3つのツールを組み合わせることができます。
cut -d "," -f2 file | tr -d " " | grep -E "^.{5}$"