2012-05-15 12 views
7

Puramente académico, pero me está frustrando.Eliminar palabras duplicadas en una línea con sed

Quiero corregir este texto:

there there are are multiple lexical errors in this line line 

usando sed. Llegué hasta aquí:

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

¡Corrige todo excepto las palabras finales dobladas!

there are multiple lexical errors in this line line 

¿Puede un gurú de sed explicar por qué lo anterior no se ocupa de las palabras al final?

+0

N. B. RE - '[, \ n]' sed usa '\ n' como un delimitador de línea. Entonces, a menos que insertes '\ n' en el espacio de patrones, nunca los encontrarás después de haber leído una línea en el espacio del patrón. – potong

Respuesta

10

Esto se debe a que en el último caso (line) su memoria regex 1 tendrá line (línea seguida de un espacio) y usted está buscando su repetición. Como no hay espacio después de la última line, la coincidencia falla.

Para corregir esto, agregue un espacio después de la palabra final line.

alternativa, se puede cambiar la expresión regular a:

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

See it

Cuestiones relacionadas