2009-06-30 14 views
6

Estoy tratando de tener una línea de texto comoevadir el carácter '' en la cadena de reemplazo en una expresión de sed

13) Check for orphaned Path entries 

y cambiarlo a (Quiero que los códigos de color golpe para colorear la salida, no se muestra en la pantalla)

\033[32m*\033[0m Check for orphaned Path entries 

con códigos de color bash para colorear el asterisco para que se destaque más. Tengo un comando sed que hace la mayor parte de eso, excepto que no maneja los códigos de color correctamente ya que los ve como referencias al texto de reemplazo.

Lo que tengo hasta ahora:

sed "s/ *13) \(.*\)/ \033[32m*\033[0m \1/" 

que produce el siguiente resultado cuando se ejecuta en la cadena que di al principio:

13) Check for orphaned Path entries33[32m* 13) Check for orphaned Path entries33[0m Check for orphaned Path entries 

Se está tomando el \ 0 de la \ 033 y reemplazándolo con la cadena original. Duplicar las barras invertidas en la cadena de reemplazo no hace la diferencia; Todavía obtengo el mismo texto de salida.

¿Cómo inserto bash color escapes en una expresión de reemplazo sed?

+0

cuadruplicar las barras invertidas causó el mismo efecto que el uso de comillas simples y doble bashslashes, según lo sugerido por @DreadPirateShawn. Obtengo \ 033 [32m * \ 033 [0m de salida directamente a la consola, sin convertirlos en códigos de color. –

+0

Es básicamente lo mismo. Es por eso que ya he borrado mi comentario. – balpha

Respuesta

9

Lo más probable es que el sed que está utilizando no entienda octal, pero puede entender hexadecimal.Prueba esta versión para ver si funciona para usted (usando \x1b en lugar de \033):

sed "s/ *13) \(.*\)/ \x1b[32m*\x1b[0m \1/" 
+2

si hace grok octal, use \ o033 – Hasturkun

+0

@Hasturkun: Por eso vale la pena leer el archivo de información. A veces el hombre simplemente no lo corta. Gracias por la info. –

+0

@Dennis: ¿Quiere decir que a veces el hombre no tiene el mismo manual que la información? –

2

Doble las barras invertidas en la cadena de reemplazo, y el uso sencillo en lugar de comillas dobles alrededor de la expresión sed:

sed 's/ *13) \(.*\)/ \\033[32m*\\033[0m \1/' 

Esto evita que la cáscara de interferir con el comportamiento sed.

~~~~~~~

Actualización:

utilizar un script para lograr el color limpiamente:

colorize.sh

#!/bin/sh 

HIGHLIGHT=`echo -e '\033[32m'` 
NORMAL=`echo -e '\033[0m'` 

sed "s/ *13) \(.*\)/ $HIGHLIGHT*$NORMAL \1/" yourinputtext 
+0

Mientras sed no está tratando de reemplazar el \ 0 ahora, todavía no estoy obteniendo resultados coloreados. –

+0

Para ser más específico, obtengo \ 033 [32m * \ 033 [0m de salida directamente a la consola, sin convertirlo en códigos de color –

+0

No estoy muy seguro de lo que quiere decir ... Mi objetivo era resolver el problema de escapar del ' \ 'carácter en la cadena de reemplazo, y lo hizo - Obtengo el mismo texto de salida que cita en su cadena "cambiarlo a" anterior. Más allá de eso, sabes lo que buscas en cuanto a colores más que yo; solo quería asegurarme de tener las herramientas listas para hacerlo. :-) – DreadPirateShawn

-1

Prueba esto:

sed "s/ *13) \(.*\)/ \\\\033 \1/" 

es decir, slash-sla sh-slash-slash-033

8

su '\ 033' es de hecho un solo carácter ESC (escape), a la salida de este se puede utilizar cualquiera de lo siguiente:

  • \o033
  • \d027
  • \x1B
  • \c[ para CTRL-[
+0

+1 para el prefijo octal - la mayoría de los programas solo reconocen el cero inicial. –

2

que tenían el mismo problema y lo resuelve de esta manera.

Puede intenta cambiar su código:

sed "s/ *13) \(.*\)/ \033[32m*\033[0m \1/" 

en esto:

sed "s/ *13) \(.*\)/ $(echo '\033[32m')*$(echo '\033[0m') \1/" 

La idea básica es utilizar 'eco' para imprimir el mandato de escape. Funcionó para mí,

0

utilizo gawk

gawk -v string1=$STRING1 -v IGNORECASE=1 ' { gsub (string1 , "\033[1m&\033[0m") ; print } ' 
Cuestiones relacionadas