例えばmagickかconvertかcropかrtkを3つ以上含む行を検索する正規表現は次になります。
^.*(magick|convert|crop|rtk)(?!.*\1).*(magick|convert|crop|rtk)(?!.*(?:\1|\2)).*(magick|convert|crop|rtk).*
後方参照によって既に選ばれた文字列を除外する、というのがこの正規表現の考えです。.*(magick|convert|crop|rtk)でキーワードが出るまで読み、(?!.*\1)で既に読んだキーワードを弾く、というのを繰り返します。ワンパターンの繰り返しですので、この構文をつくるプログラムを作ったりなんかすると楽です。次はjavascriptのサンプルです。
p = '(magick|convert|crop|rtk)'
r = '^'
for(i = 1; i < 3; i++){
r = r + '.*'+ p + '(?!.*(?:\\1'
for(j = 2; j <= i; j++){
r = r + '|' + '\\' + j
}
r = r + '))'
}
r = r + '.*'