Avec grep GNU :
echo 'Hi! Hi, same word twice twice, as as here here! ! ,123 123 need' | grep -Eo '(\b.+) \1\b'
Sortie :
twice twice as as here here 123 123
Options :
-E
:Interpréter (\b.+) \1\b
sous forme d'expression régulière étendue.
-o
:n'imprime que les parties correspondantes (non vides) d'une ligne correspondante, chacune de ces parties sur une ligne de sortie distincte.
Regex :
\b
:est une limite de mot de largeur nulle.
.+
:Correspond à un ou plusieurs caractères.
\1
:Les parenthèses ()
marquer un groupe de capture et \1
signifie utiliser ici la valeur du premier groupe de capture.
Référence :FAQ sur les expressions régulières de débordement de pile
Il semble que quelque chose comme ceci est ce que vous voulez (en utilisant n'importe quel awk dans n'importe quel shell sur chaque machine 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
mais veuillez poser une nouvelle question avec un exemple d'entrée plus représentatif et une sortie attendue, y compris la ponctuation, les différences de capitalisation, plusieurs paragraphes, les mots en double au début/à la fin des phrases et divers autres cas non triviaux sont affichés.