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 fmt
antes degrep
, pero cuando la cadena de búsqueda abarca varias palabras, esto no funciona.
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). –