1

正規表現に一致する文字列を含む単語をカウントするには、egrepを使用する必要があります。たとえば、「3つの連続する母音を含む単語の数を数える」のようなことをする必要があります(正確にはそうではありませんが、それが要点です)。

これらの単語を含む行をカウントする方法を理解しましたが、-wタグを追加するとegrep: illegal option -- wエラーが発生します。

上記のシナリオで行をカウントするために使用する正規表現は次のとおりです。これは機能しているようです。

egrep -i -c '[aeiou][aeiou][aeiou]' full.html

このコマンドでタグを使用する-wと、正規表現の前後に\ bタグを追加しても、上記のエラーが発生します。例えば:

egrep -i -c -w '\b.*[aeiou][aeiou][aeiou].*\b' full.html

私は何が間違っているのですか?

編集:私はこれをターミナルの外のSolaris10で実行しています。

4

4 に答える 4

5

この方法を使用して、文字列を含む単語の数を見つけます

grep --color -Eow '[aeiou][aeiou][aeiou]' filename | wc -l

また

egrep -ow '[aeiou][aeiou][aeiou]' filename | wc -l

o 一致したもののみを印刷する場合。

w は単語です。

最後に、単語の数が表示されます。

于 2012-09-29T13:07:23.170 に答える
1

egrepがGNUのような拡張機能のいずれか/すべて/一部をサポートしているかどうかを知るには、solarisのmanページを参照する必要があります。

システムに/usr/ xpg4 / binがありますか?はいの場合、MANPATHに/ usr / xpg4/manが含まれていることを確認してください。そのディレクトリには、/ opt / gnu installのようなものを追加する以外は、最新バージョンが含まれていました。

いずれにせよ、あなたの正規表現'\b.*[aeiou][aeiou][aeiou].*\b'は私の目には...

1 word-boundary
followed by any number of any chars (including blanks and vowels) 
followed by three vowels, 
followed by any number of any chars (including blanks and vowels), 
followed by 1 word-boundary. 

おそらくあなたが本当に望んでいるものではないでしょう。

3つの母音が連続し、古い/正方形の正規表現の長い手を使用して単語のニーズを満たすには、

 egrep -i -c '[a-z]*[aeiou][aeiou][aeiou][a-z]*' full.html

つまり、chars [az]を任意の数(noneを含む)、3母音の前に一致させ、その後に任意の数のchars [az](noneを含む)を続けます。したがって、スペース文字は[az]と一致しません。大文字と小文字を区別しないために-iを使用しているため、を使用する必要はありません[A-Za-z]。明らかに、単語文字と見なしたい他の文字、おそらく'_'文字?を見つけた場合は、それを両側に追加します。

申し訳ありませんが、私はここでメモリから移動します。Solarisショップで働いていないため、そこでテストできません。

編集

また、grepの現在のシステムのmanページには次のように書かれていることに注意してください。

  -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.

一致する行の数ではなく、一致する行の数であることに注意してください。

使いやすいかもしれません

  awk '{for (i=1;i<=NF;i++){if ($i ~ /.*[aeiou][aeiou][aeiou].*/) cnt++};}; END{print "count="cnt}'file

IHTH

于 2012-09-28T21:03:20.940 に答える
0

egrepは\b単語の境界をサポートしていないと思います。\<単語の境界の始まりと単語の境界\>の終わりを試してください。

編集
うーん...気にしないでください。マニュアルページ による\bとサポートされています。

実際、答えはgrepだけが「-w」オプションをサポートしているということだと思います。egrepはそうは思わない。 http://ss64.com/bash/egrep.html

于 2012-09-28T16:48:57.127 に答える
0

どのプラットフォームとどのバージョンの egrep ですか?

-w オプションは私にとっては機能します(GNU egrepを使用するCentOSおよびMac)-以下を参照してください。また、\b期待どおりに動作します-以下を参照してください。

また、別の正規表現を使用しました-以下を参照してください。

$ grep --version
grep (GNU grep) 2.5.1

$ cat test.txt 
this and that iou and eai
not this aaih
not this haai

$ egrep -i -w '[aeiou]{3}' test.txt 
this and that iou and eai

# with no -w
egrep -i '\b[aeiou]{3}\b' test.txt
this and that iou and eai

# with neither -w nor {3}
$ egrep -i '\b[aeiou][aeiou][aeiou]\b' /tmp/test.txt 
this and that iou and eai

# using '\<' and '\>' works as well for word boundaries
$ egrep -i '\<[aeiou][aeiou][aeiou]\>' /tmp/test.txt 
this and that iou and eai
于 2012-09-28T16:56:05.913 に答える