2011-03-31 9 views
6

Me gustaría usar sed para reemplazar líneas nuevas, pestañas, comillas y barras invertidas en un archivo de texto para usarlo como constante de caracteres en C, pero estoy perdido al principio. Sería bueno mantener las líneas nuevas también en el resultado, agregando un '\ n', luego una comilla doble para cerrar la línea de texto, un crlf y otra comilla doble para reabrir la línea, por ejemplo:Usar sed para convertir archivos de texto a una cadena C

line1

line2

se convertiría en

"línea 2 \ n" "línea 1 \ n"

puede alguien al menos me punto en el ¿dirección correcta? Gracias

Respuesta

10

probar este como un archivo sed comando:

s/\\/\\\\/g 
s/"/\\"/g 
s/ /\\t/g 
s/^/"/ 
s/$/\\n"/ 

NB: hay una pestaña integrada en la tercera línea, si se utiliza vi inserción presionando ^v <tab>

  1. s/\\/\\\\/g - escapar de las barras inclinadas invertidas
  2. s/"/\\"/g - citas de escape
  3. s/ /\\t/g - convertir pestañas
  4. s/^/"/ - Introduce cita
  5. s/$/\\n"/ - anexar \ ny cita
+0

Su solución es mucho mejor. –

+0

increíble, gracias! –

+1

(3) probablemente debería usar \ t en lugar de una pestaña incrustada (más fácil de copiar/pegar). (4) y (5) probablemente deberían tener/g en el extremo, de lo contrario no se aplicarán a todas las líneas. Finalmente, agregaría (6) s/\ r // g para quitar los retornos de carro de Windows (que ensucian las cosas). Funciona según lo solicitado para mí con estos cambios. –

-1

En Perl, presentar de entrada de la entrada estándar, a la salida estándar. Hexifica, así que no te preocupes por escapar de cosas. No elimina pestañas, etc. La salida es una cadena C estática.

use strict; 
use warnings; 

my @c = <STDIN>; 

print "static char* c_str = {\n"; 
foreach (@c) { 
    my @s = split(''); 
    print qq(\t"); 
    printf("\\x%02x", ord($_)) foreach @s; 
    print qq("\n); 
} 
print "};\n"; 
1

Mejor aún:

'"'`printf %s "$your_text" | sed -n -e 'H;$!b' -e 'x;s/\\/\\\\/g;s/"/\\"/g;s/ /\\t/g;s/^\n//;s/\n/\\n" \n "/g;p'`'"' 

A diferencia de la anterior, esta maneja correctamente los saltos de línea también. Me gustaría llamarlo de una sola línea.

Cuestiones relacionadas