2016-10-21 7 views
3

egrepを使用して3つの文字のすべての単語をファイルにリストアしようとしています。egrep bは一重引用符を認識しません

サンプル入力。

タップ

ベルト

できない

ない


正規表現。

egrep "\b[a-zA-Z]{3}\b"

私は私の3文字の単語がリストされ得るが、なぜは結果に表示することができないのですか?私は私の元の質問への答えを受けていると私は今使用

EDIT

egrep '^[a-zA-Z]{3}$'

私は行ごとに1つだけの単語を持っているので、これは動作します。私の質問は更新されました。その答えは少し脆いからです。

入力が1行ではなく、行と段落であれば、3文字の単語を検索するにはどうすればよいですか?

+2

おそらく '' 'coun単語の境界としてのts、言語的には「できません」という3文字の単語が2つあります。 –

+0

はい、それはできますし、別々にリストされていませんが、私はしたくないです! \ bの代わりに^と$を使用していないのですか? – leonormes

+0

サンプル入力と期待される出力を投稿できますか? – anubhava

答えて

2

1行に複数の単語がある場合、アンカーは使用できません。

あなたのgrepが-P(PCRE)オプションをサポートしている場合、あなたは先読み正規表現を使用することができます。

grep -oiP '\b[a-z]{3}(?=\s|$)' file 

-Pが利用できない場合は、あなたが使用することができますが:

grep -oiE '\b[a-z]{3}(\s|$)' file 

第二grepがあります後続のスペース。あなたにもそれを削除したい場合は、次に使用:あなたはあなたができる、その後gnu awkをお持ちの場合は

awk '{for (i=1; i<=NF; i++) if (length($i)==3) print $i}' file 

grep -oiE '\b[a-z]{3}(\s|$)' file | awk '{print $1}' 

またここはすべて3文字のフィールドを印刷するawkソリューションです。それをもっと短くしてください:

awk -v RS='[[:space:]]' 'length($0) == 3' file 
+1

' awk'の答えは私が望むものです!私はどこでも使える一般的な解決策です!ありがとう – leonormes

+0

'-w'オプションを使って、単語だけをマッチさせることができます...' grep -woiE '[az] {3}' '、' grep -woi '[az] [az] [az]' ' – Sundeep

+1

@Sundeep: '-w'はOPが望んでいない' can'で 'can'を見つけるでしょう。 – anubhava

2

ファイルには、1行に1語が付いているため、単語境界ではなく行末に固定してください。

egrep -i '^[a-z]{3}$' | sort 

あなたのコードの問題は、任意の単語文字と非単語文字、および'\b試合は、非単語文字であるということです。

+0

サンプル出力はその前提条件と一致しています。彼は '-o'を使用していませんが、すべては1行に1単語だけです。 – Barmar

+0

または '-x'オプションを使って行全体にのみ一致するようにしてください – Sundeep

関連する問題