2009-12-06 14 views
5

¿Cómo no lo hace usted dice lo siguiente en expresiones regulares:Convertir espacios en tabulaciones en RegEx

foreach line 
    look at the beginning of the string and convert every group of 3 spaces to a tab 
    Stop once a character other than a space is found 

Esto es lo que tengo hasta ahora:

/^ +/\t/g 

Sin embargo, esto convierte cada espacio de 1 pestaña

Cualquier ayuda sería apreciada.

+1

Por favor, publique el código que ha escrito hasta ahora. A la gente en general no le gusta simplemente escribir un código para ti. –

Respuesta

7

Con Perl:

perl -pe '1 while s/\G {3}/\t/gc' input.txt >output.txt 

Por ejemplo, mediante la siguiente entrada

nada 
    three spaces 
    four spaces 
    three in the middle 
     six space 

la salida (TABS reemplazados por \t) es

$ perl -pe '1 while s/\G {3}/\t/gc' input | perl -pe 's/\t/\\t/g' 
nada 
\tthree spaces 
\t four spaces 
\tthree in the middle 
\t\tsix spaces 
+1

Greg, gracias por la gran respuesta! Sin embargo, parece ser innecesariamente complicado. Tanto el '1 while' como el' // c' parecen superfluos. Solo para estar seguro, traté de ejecutar tu entrada de muestra con todas las permutaciones de mantener/omitir esos dos elementos superfluos y obtener resultados idénticos. Por lo tanto, uno podría simplificar el código simplemente con 'perl -pe 's/\ G {3}/\ t/g'' –

-1

Es posible que desee /^(?: {3})*/\t/g

editar: fijo

+0

Esto convierte 3 espacios en 1 pestaña, pero también 6 o 9 o 12 espacios, etc. 1 pestaña –

+0

no corregido. Intente ejecutarlo en los datos de muestra de Greg Bacon. "nada" y "seis espacios" están rotos. Y le falta el 's'. –

3

Sé que esta es una vieja pregunta, pero pensé que le daría una respuesta completa de expresiones regulares que funciona (bueno, funcionó para mí).

s/\t* {3}/\t/g 

que suelen utilizar esto para convertir un documento completo en vim hacer esto en vim se ve así:

:%s/\t* \{3\}/\t/g 

espero que todavía ayuda a alguien.

+1

Convierte espacios en el medio de la línea, violando "Detener una vez que se encuentre un personaje que no sea un espacio" –

Cuestiones relacionadas