egrep expression régulière – même mot au début et à la fin

Je veux find toutes les lignes qui ont le même mot au début et à la fin de la ligne.

Par exemple:

goodword fgdlakj 3t sfkl 43lk fkl goodword bad sfa;lk3t dgk;gs 34;kl bad334 singleword 

Sortie souhaitée

 goodword fgdlakj 3t sfkl 43lk fkl goodword singleword 

Mon code est:

 egrep "(^.+)([ ]+.*\1)$" 

cela fonctionne si la ligne a plus de 1 mot. Mais je veux une ligne contenant un seul mot pour correspondre aussi.

Alors j'ai essayé:

 egrep "(^.+)($|([ ]+.*\1)$)" 

et ça ne marche plus – et je ne sais pas pourquoi.

Je propose d'utiliser awk place:

 awk '$1==$NF' file 

L'avantage de cette solution est qu'elle est plus simple à lire et que vous pouvez facilement changer le séparateur de champs (avec l'option -F ), par exemple. même le même nombre d'espaces au début et à la fin de la ligne correspondra.

Il y a vraiment une belle réponse de jimmij mais si vous insistez sur grep :

 grep -Ex '(\S+)(.*\1)?' file 

Avec un grep POSIX, un équivalent de awk '$1 == $NF' serait:

 grep -x '[[:blank:]]*\([^[:blank:]]\{1,\}\)\([[:blank:]]\(.*[[:blank:]]\)\{0,1\}\1\)\{0,1\}[[:blank:]]*'