Con GNU grep:
echo 'Hi! Hi, same word twice twice, as as here here! ! ,123 123 need' | grep -Eo '(\b.+) \1\b'
Uscita:
twice twice as as here here 123 123
Opzioni :
-E
:Interpreta (\b.+) \1\b
come espressione regolare estesa.
-o
:Stampa solo le parti corrispondenti (non vuote) di una riga corrispondente, con ognuna di queste parti su una riga di output separata.
Regex :
\b
:è un limite di parola di larghezza zero.
.+
:Corrisponde a uno o più caratteri.
\1
:Le parentesi ()
contrassegna un gruppo di acquisizione e \1
significa utilizzare qui il valore del primo gruppo di acquisizione.
Riferimento:Domande frequenti sulle espressioni regolari di Stack Overflow
Sembra che qualcosa del genere sia quello che vuoi (usando qualsiasi awk in qualsiasi shell su ogni macchina 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
ma per favore poni una nuova domanda con esempi di input più realmente rappresentativi e risultati attesi inclusi punteggiatura, differenze nelle maiuscole, paragrafi multipli, parole duplicate all'inizio/alla fine delle frasi e vari altri casi non banali.