2009-12-06 14 views
5

Come non dici quanto segue in regex:Convertire gli spazi per le schede in 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 

Questo è quello che ho finora:

/^ +/\t/g 

Tuttavia, questa converte ogni spazio a 1 scheda

Qualsiasi aiuto sarebbe apprezzato.

+1

Si prega di inviare il codice che hai scritto finora. Le persone in genere non amano scrivere solo per il codice per te. –

risposta

7

Con Perl:

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

Per esempio, con la seguente digitazione

nada 
    three spaces 
    four spaces 
    three in the middle 
     six space 

l'uscita (TAB sostituiti da \t) è

$ 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, grazie per l'ottima risposta! Sembra essere inutilmente complicato, tuttavia. Sia il '1 while' che il' // c' sembrano superflui. Per sicurezza, ho provato a eseguire il tuo input di esempio con tutte le permutazioni di mantenere/omettere quei due elementi superflui e ottenere risultati identici. Quindi, si potrebbe semplificare il codice semplicemente avendo 'perl -pe 's/\ G {3}/\ t/g'' –

-1

Probabilmente si desidera /^(?: {3})*/\t/g

modifica: fissa

+0

Converte 3 spazi in 1 scheda - ma anche 6 o 9 o 12 spazi ecc. 1 etichetta –

+0

non risolto. Prova a eseguirlo sui dati di esempio di Greg Bacon. "nada" e "sei spazi" sono entrambi rotti. E manca il leader 's'. –

3

So che questa è una domanda vecchia ma ho pensato di dare una risposta regolare completa che funziona (beh, ha funzionato per me).

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

io di solito uso questo per convertire un intero documento in vim fare questo in vim, che appare così:

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

Speranza che aiuta ancora qualcuno.

+1

Converte gli spazi nel mezzo della linea, violando "Ferma una volta trovato un carattere diverso da uno spazio" –

Problemi correlati