Con GNU grep:
echo 'Hi! Hi, same word twice twice, as as here here! ! ,123 123 need' | grep -Eo '(\b.+) \1\b'
Salida:
twice twice as as here here 123 123
Opciones :
-E
:Interpretar (\b.+) \1\b
como una expresión regular extendida.
-o
:Imprima solo las partes coincidentes (no vacías) de una línea coincidente, con cada una de esas partes en una línea de salida separada.
Expresión regular :
\b
:es un límite de palabra de ancho cero.
.+
:Coincide con uno o más caracteres.
\1
:Los paréntesis ()
marcar un grupo de captura y \1
significa usar aquí el valor del primer grupo de captura.
Referencia:Preguntas frecuentes sobre las expresiones regulares de desbordamiento de pila
Parece que algo como esto es lo que quieres (usando cualquier awk en cualquier shell en cada cuadro de UNIX):
$ cat tst.awk
BEGIN { RS=""; ORS="\n\n" }
{
head = prev = ""
tail = $0
while ( match(tail,/[[:alpha:]]+/) ) {
word = substr(tail,RSTART,RLENGTH)
head = head substr(tail,1,RSTART-1) (word == prev ? "" : word)
tail = substr(tail,RSTART+RLENGTH)
prev = word
}
print head tail
}
$ cat file
the quick quick brown
fox jumped jumped
jumped over the lazy
lazy dogs back
$ awk -f tst.awk file
the quick brown
fox jumped
over the lazy
dogs back
pero haga una nueva pregunta con una entrada de muestra más verdaderamente representativa y se muestran resultados esperados que incluyen puntuación, diferencias en mayúsculas, párrafos múltiples, palabras duplicadas al principio/final de las oraciones y varios otros casos no triviales.