grep -E '^[^0-9]*1234([^0-9]+1234)*[^0-9]*$' file.txt
Explicação
-
^[^0-9]*1234: encontre a primeira correspondência de1234, que pode ser precedida por caracteres não dígitos. -
([^0-9]+1234)*: pode haver mais iterações de1234, mas elas devem ser separadas do primeiro1234(e outros1234) por caracteres não dígitos (portanto use+). -
[^0-9]*$: corresponde à linha inteira (com$). Pode haver caracteres não dígitos após o1234final (mas não necessariamente, portanto,*).
EDITAR
Se 1234 precisar ser delimitado por espaços (ou estar no início ou no final da linha), use
grep -E '^([^0-9]* )?1234(( [^0-9]*)? 1234)*( [^0-9]*)?$'
Explicação
-
^([^0-9]* )?: pode haver caracteres não dígitos para começar, contanto que eles terminem com um espaço. -
1234: encontre a primeira correspondência (obrigatória) de1234. -
(( [^0-9]*)? 1234)*: Eu vou trabalhar com os parênteses para trás. Pode haver (zero ou mais) cópias adicionais de1234, mas elas devem ser precedidas por um espaço, ou seja,1234. Antes desse espaço, pode haver caracteres não dígitos, o que é bom contanto que eles sejam separados da cópia anterior de1243por outro espaço, ou seja,( [^0-9]*)?. -
( [^0-9]*)?$: pode haver caracteres não dígitos para terminar, desde que sejam precedidos por um espaço.