2009-12-06 16 views
5

Wie sagt man folgendes in regex:konvertieren Leerzeichen zu Tabulatoren 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 

Dies ist, was ich bisher:

/^ +/\t/g 

Dies ist jedoch jeden Raum auf 1 Registerkarte konvertiert

Jede Hilfe wäre willkommen.

+1

Bitte schreiben Sie den Code, den Sie bisher geschrieben haben. Die Leute schreiben im Allgemeinen nicht nur für Code für Sie. –

Antwort

7

Mit Perl:

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

Zum Beispiel mit der folgenden Eingabe

nada 
    three spaces 
    four spaces 
    three in the middle 
     six space 

der Ausgang (TABs durch \t ersetzt) ​​ist

$ 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, danke für die tolle Antwort! Es scheint jedoch unnötig kompliziert zu sein. Sowohl die "1 while" als auch die "// c" scheinen überflüssig. Nur um sicher zu sein, habe ich versucht, Ihre Beispieleingabe mit allen Möglichkeiten auszuführen, diese zwei überflüssigen Elemente zu behalten/wegzulassen und identische Ausgaben zu erhalten. So könnte man den Code vereinfachen, indem man einfach 'perl -pe '/ \ G {3}/\ t/g'' –

-1

Sie wahrscheinlich /^(?: {3})*/\t/g

wollen

bearbeiten: fixed

+0

setzt. Dies konvertiert 3 Leerzeichen in 1 Tab - aber auch 6 oder 9 oder 12 usw. Leerzeichen nur 1 Registerkarte. –

+0

nicht behoben. Versuchen Sie es mit den Beispieldaten von Greg Bacon. "Nada" und "sechs Räume" sind beide gebrochen. Und es fehlen die führenden 's'. –

3

Ich weiß, das ist eine alte Frage, aber ich dachte, ich würde eine volle Regex-Antwort geben, die funktioniert (gut, es hat für mich funktioniert).

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

ich dies in der Regel verwenden, um ein ganzes Dokument in vim konvertieren tun dies in vim es wie folgt aussieht:

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

Hoffe, dass es noch jemand hilft.

+1

Konvertiert Leerzeichen in der Mitte der Zeile und verletzt "Stop, sobald ein anderes Zeichen als ein Leerzeichen gefunden wird" –

Verwandte Themen