2009-07-12 18 views
5

Uso (GNU) fmt para formatear textos largos con bonitos ("óptimos") saltos de línea. Sin embargo, si el texto contiene secuencias de escape de color ANSI (que nunca se muestran, y solo sirven para colorear el texto al mostrarlo), fmt considera que estos son caracteres normales y calcula las longitudes de línea incorrectas.Cómo ocultar los códigos de escape de color ANSI de fmt

No estoy seguro de cuán buenos son los caracteres de escape literal que funcionan aquí, así que aquí hay un ejemplo simple usando grep para generar las secuencias ANSI. Comencemos con una cadena larga para formatear.

string="Here’s an example of a rather long \ 
string with quite a few words in the middle \ 
that grep chooses to colour red." 

Si no destacamos los grep partidos, todo funciona bien:

echo $string | grep --color=no i | fmt -w 50 

Pero si destacamos/colorearlas, fmt considera las líneas que contienen la letra 'i' a ser mucho más largo de lo que realmente son, y se muestran como líneas cortas cuando se muestran en una terminal.

echo $string | grep --color=yes i | fmt -w 50 

¿Hay alguna manera de evitar esto? Para este ejemplo, por supuesto podría usar fmtantes degrep, pero cuando la cadena de búsqueda abarca varias palabras, esto no funciona.

Respuesta

5

No parece haber una buena manera de resolver eso usando grep y fmt. Recomiendo ejecutar fmt primero y luego usar sed en lugar de grep para buscar. Por ejemplo:

echo The search string will be highlighted red. | fmt -w 50 | sed ":a;$!N;$!ba;s/search[ \n]string/\x1b\[1;31m&\x1b\[0m/g"
+0

Gracias. Esa es la solución que terminé usando. Mi uso en el mundo real de esto involucra 'sed' en lugar de' grep'. Básicamente, convierto etiquetas (como '|' en 'esto es un | ejemplo | cadena') en secuencias de color ANSI para colorear las palabras que abarcan. Usar 'fmt' antes de reemplazar no es óptimo, ya que las etiquetas ocupan un poco de espacio, lo que afecta el ajuste de la palabra, pero no es tan malo a menos que una línea contenga muchas de esas etiquetas, y es mejor que ejecutar' fmt' después reemplazando (ya que las secuencias de escape ANSI toman muchos más caracteres). –

0

El uso de `grep --colour = auto 'en su lugar resolvería el problema.

+0

No, no lo haría. Usar 'grep --colour = auto' tiene el mismo resultado que usar' grep --colour = no' en este ejemplo. –

Cuestiones relacionadas