regulares - sed linux




Cómo manejar los códigos de color cuando se intenta usar grep, sed, etc. (2)

Esta fea expresión debería hacerlo

git diff --color src/Strmrs.h| grep $'^\(\x1b\[[0-9]\{1,2\}m\)\{0,1\}+'

  • El $'...' convertirá al \ x1b en el carácter ESC (aka ^[ ) - esto probablemente se puede evitar, yo era demasiado flojo para leer la página de manual
  • la secuencia de colores (ESC, corchete izquierdo, 1-2 dígitos y la letra m ) están encerrados en el conjunto externo de \(\) que luego se vuelven opcionales con \{0,1\} el único elemento no opcional es el último + .
  • Supone que hay como máximo una secuencia de colores al comienzo de la línea

Estoy tratando de usar sed para procesar alguna salida de un comando que está generando líneas de color (es git diff, pero no creo que eso sea importante). Intento hacer coincidir un signo '+' al principio de la línea, pero esto se confunde con el código de color, que precede al '+'. ¿Hay alguna manera simple de solucionar este problema o necesito usar alguna expresión regular complicada para que coincida con el código de color?

Si es posible, me gustaría preservar el color de la línea.


Si debes tener el color, entonces tendrás que hacer algo feo:

$ git diff --color web-app/db/schema.rb |grep '^^[\[32m+

Ese ^[ es en realidad un personaje de escape sin formato ( Ctrl + V ESC en bash, ASCII 27). Puede usar cat -v para descubrir las secuencias de escape necesarias:

$ git diff --color web-app/db/schema.rb |cat -v
^[[1mdiff --git a/web-app/db/schema.rb b/web-app/db/schema.rb^[[m
^[[1mindex 45451a2..411f6e1 100644^[[m
^[[1m--- a/web-app/db/schema.rb^[[m
^[[1m+++ b/web-app/db/schema.rb^[[m
...

Este tipo de cosas funcionará bien con las versiones GNU de sed , awk , ... YMMV con versiones que no sean GNU.

Una forma más fácil sería cambiar el color:

$ git diff --no-color file

Pero puedes intercambiar resultados bonitos por expresiones regulares ligeramente feas.





grep