reemplazar una cadena desconocida entre dos cadenas conocidas con sed

Tengo un archivo con los siguientes contenidos:

WORD1 WORD2 WORD3

¿Cómo puedo usar sed para reemplazar la cadena entre WORD1 y WORD3 con foo , de modo que el contenido del archivo cambie a lo siguiente ?:

WORD1 foo WORD3

Intenté lo siguiente, pero obviamente me falta algo porque eso no produce los resultados deseados:

sed -i '' 's/WORD1.*WORD3/foo/g' file.txt

 sed -i 's/WORD1.*WORD3/WORD1 foo WORD3/g' file.txt 

o

 sed -i 's/(WORD1).*(WORD3)/\1 foo \2/g' file.txt 

Es posible que necesite escapar de los corchetes, depende de su variante sed.

Esto podría funcionar para usted:

 sed 's/\S\+/foo/2' file 

o quizás:

 sed 's/[^[:space:]][^[:space:]]*/foo/2' file 

Si WORD1 y WORD3 aparecen más de una vez:

 echo "WORD1 WORD2 WORD3 BLA BLA WORD1 WORD4 WORD3" | sed 's/WORD3/\n&/g;s/\(WORD1\)[^\n]*\n/\1 foo /g' WORD1 foo WORD3 BLA BLA WORD1 foo WORD3 

contenido de un file.txt

 $ cat file.txt WORD1 WORD2 WORD3 WORD4 WORD5 WORD6 WORD7 WORD8 WORD9 

(Corrección por @DennisWilliamson en comentario)
$ sed -e 's/\([^ ]\+\) \+\([^ ]\+\) \+\(.*\)/\1 foo \3/' file.txt

 WORD1 foo WORD3 WORD4 foo WORD6 WORD7 foo WORD9 

mientras que awk es de alguna manera más simple

$ awk -F' ' '{ print $1" foo "$3 }' file.txt

 WORD1 foo WORD3 WORD4 foo WORD6 WORD7 foo WORD9