Primeiro, você deve sempre citar a expressão grep, como tentar lembrar o que o shell faz com que caractere especial é uma dor:
grep -o -E '[x]{3,4}' testfile
Em segundo lugar, grep
encontrará uma correspondência mínima, é fácil assim, por isso, combinaremos com 3 ou 4 corridas de x
em uma execução mais longa de x
s. Para evitar isso, algum tipo de condição de contorno será necessário para não corresponder a um subconjunto de uma execução mais longa. Um grep
com suporte a PCRE pode usar lookarounds de largura zero para conseguir isso:
(echo xxx; echo xxxxxx) | grep -P '(?<!x)xxx(?!x)'