Wie ersetze ich mit sed führende Tabs durch 4 Leerzeichen?

Wie ersetze ich mit sed führende Tabs durch 4 Leerzeichen?

In vim scheint Folgendes möglich zu sein:

:s/^\t\+/\=repeat('    ',len(submatch(0)))

Ich habe nicht herausgefunden, wie sich das in sed übersetzen lässt. Ich habe Folgendes versucht:

sed -ri "s/^\t\+/\=repeat('    ',len(submatch(0)))/g" test.txt

Der Befehl scheint keine Wirkung zu haben.

Antwort1

Dafür ist zB. expandda expand -t 4 file.txt.

expandbearbeitet die Originaldatei nicht, aber Sie können zu einer neuen Datei weiterleiten und mvdiese über die Originaldatei legen oder verwenden sponge, wenn Sie es installiert haben, z. B.

    expand -t 4 file.txt > file.new && mv file.new file.txt
or 
    expand -t 4 file.txt | sponge file.txt

Zu Ihrer Information: Versuchen Sie, unexpandes umgekehrt zu machen und mehrere Leerzeichen in Tabulatoren umzuwandeln.

Sowohl expandals auch unexpandunterstützen die Verwendung von Tabs mit fester Breite (z. B. -t 4oder -t 8usw.)odereine Liste von Tabulatorpositionen (z. B. -t 4,12,32). Sie haben auch Optionen, um nur anfängliche, führende Leerzeichen/Tabulatoren zu konvertieren. Weitere Informationen finden Sie in den Manpages.


Weitere Informationen spongefinden Sie unter man spongeundGibt es eine Standardalternative zu Sponge, um eine Datei in sich selbst weiterzuleiten?. Kurz gesagt, es führt die Umleitung und mv für Sie durch, indem es eine temporäre Datei verwendet. Übrigens, versuchen Sie niemals, stdout auf dieselbe Datei umzuleiten, die gerade als stdin verwendet wird. Die Shell überschreibt sie, bevor sie überhaupt gelesen wird.

spongeist aus demmehrutilsPaket.


PS: Siehe auchGNU-Einzugoder eines der vielen anderen ähnlichen Tools zur Neuformatierung des Quellcodes.

Antwort2

$ cat -T /tmp/test.txt
^I^I^I3^I<= this final tab should remain
^I^I2
^I1

Mit sed:

sed ':loop;s/^\( *\)\t/\1    /;tloop' /tmp/test.txt | cat -T
            3^I<= this final tab should remain
        2
    1

Das obige erstellt eine Schleife (ironischerweise mit loop) die alle führenden Leerzeichen und einen führenden Tabulator erfasst, die Leerzeichen ersetzt und den Tabulator in 4 Leerzeichen umwandelt; bei Erfolg ( t) wird zur Schleife zurückverzweigt. Siehehttps://stackoverflow.com/a/35017207/493161

verwandte Informationen