Ошибка в том, что сначала ваш ввод «портится» bash-ем. Лучше всегда использовать строки в одиночных кавычках, если не нужно что бы их обработал bash.
В вашем примере
grep [0-9]\{4\}XX[0-9]{4\} test.txt
сначала обработается bash-ем, он уберёт обратные слеши и сам grep попадёт выражение уже без обратных слешей
[0-9]{4}XX[0-9]{4}
и очевидно не срабатывает. Что бы обратный слеш добрался до grep надо его экранировать ещё одним обратным слешом
$ grep [0-9]\\{4\\}XX[0-9]\\{4\\} test.txt
1234XX1234
1234XX1234
Но проще использовать кавычки
$ grep "[0-9]\{4\}XX[0-9]\{4\}" test.txt
1234XX1234
1234XX1234
а ещё лучше использовать режим расширенных (как предложил
Zzzz9) или perl-совместимых регулярных выражений
$ grep -E "[0-9]{4}XX[0-9]{4}" test.txt
1234XX1234
1234XX1234
$ grep -P "\d{4}XX\d{4}" test.txt
1234XX1234
1234XX1234
(хотя для последнего нужно хорошо знать и уметь регулярки)