Acho que o problema é que a regex consome os caracteres que correspondem a . Você pode ser capaz de contornar isso, até certo ponto, usando asserções de comprimento zero, se o seu mecanismo de regex oferecer suporte a elas.
Por exemplo, se você precisar apenas contar as ocorrências, você pode usar um PCRE que consiste em um único caractere seguido por um lookahead que consiste em (21 - 1) caracteres seguidos por gt
, por exemplo no GNU grep com seu modo PCRE,
$ printf 'aaaatccataaatcgaggattacaagtggaaaacaaggaggcagt' |
grep -Po '.(?=.{20}gt)'
t
c
, que produz o caracter inicial de cada substring correspondente, permitindo sobreposições de todos, exceto de um único caractere. (Você pode canalizar o resultado para wc -l
para uma contagem real).
Se você precisar recuperar as sequências de correspondência reais que são obviamente mais difíceis, já que você precisa consumir e não consumir caracteres - provavelmente há uma maneira de fazer isso retornando a correspondência índices e depois fazendo correspondências substring, por exemplo, algo assim em (provavelmente ruim) perl
$ printf 'aaaatccataaatcgaggattacaagtggaaaacaaggaggcagt' |
perl -lne 'while ($_ =~ m/.(?=.{20}gt)/g) {print substr($_,@+[0]-1,23)}'
tccataaatcgaggattacaagt
caagtggaaaacaaggaggcagt