2012-05-15 11 views
7

Rein akademisch, aber es frustriert mich.Entfernen Sie doppelte Wörter in einer Zeile mit sed

Ich möchte diesen Text korrigieren:

there there are are multiple lexical errors in this line line 

mit sed. Ich habe so weit:

sed 's/\([a-z][a-z]*[ ,\n][ ,\n]*\)\1/\1/g' < file.text 

Es korrigiert alles außer den endgültigen verdoppelten Worten!

there are multiple lexical errors in this line line 

Kann ein Sed Guru bitte erklären, warum das oben genannte nicht mit den Worten am Ende beschäftigt?

+0

N. B. RE - '[, \ n]' sed verwendet das '\ n' als Zeilenbegrenzer. Wenn Sie also '\ n''s nicht in den Musterbereich einfügen, werden Sie ihnen nach dem Einlesen einer Zeile in den Musterbereich nie begegnen. – potong

Antwort

10

Dies ist, weil in Ihrem letzten Fall (line) Ihr Regex-Speicher 1 line (Zeile gefolgt von einem Leerzeichen) darin haben wird, und Sie suchen nach seiner Wiederholung. Da nach dem letzten line kein Platz mehr ist, schlägt die Übereinstimmung fehl.

Um dies zu beheben, fügen Sie ein Leerzeichen nach dem Endwort line hinzu.

Alternativ können Sie die Regex ändern:

sed -e 's/\b\([a-z]\+\)[ ,\n]\1/\1/g' 

See it

Verwandte Themen