title: grep a range of N to N tokens
body: <p>I would like to grep (I can accept non-grep answers but it is what I am most used to for this) lines which have a range of tokens delimited by a whitespace and with the ability to ignore punctuation marks. This means that if I want three to five tokens I would get lines with three, four or fives tokens but not one, two, six or twenty tokens. I have periods at the end and sometimes commas in the middle which I things I would like to account for if possible.  Also the real data is actually words so I would like an answer with clear instructions for allowing characters which are not necessarily a-zA-Z, for example the word "can't".</p>
  
  <p>My data is like this:</p>
  
  <pre><code>aa .
  aa bb'b , c ddd e f gg .
  aa bb .
  aaa bb'b cccc dddd e .
  aaaa bb'b cccc , dddd .
  aa bb'b cc dd e f .
  aaaaa bb'b c .
  </code></pre>
  
  <p>I tried this:</p>
  
  <pre><code>grep -e "[a-zA-Z']* ,*\{3,5\}"
  </code></pre>
  
  <p>What I expected to get was this:</p>
  
  <pre><code>aaa bb'b cccc dddd e .
  aaaa bb'b cccc , dddd .
  aaaaa bb'b c .
  </code></pre>