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. expand
da expand -t 4 file.txt
.
expand
bearbeitet die Originaldatei nicht, aber Sie können zu einer neuen Datei weiterleiten und mv
diese ü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, unexpand
es umgekehrt zu machen und mehrere Leerzeichen in Tabulatoren umzuwandeln.
Sowohl expand
als auch unexpand
unterstützen die Verwendung von Tabs mit fester Breite (z. B. -t 4
oder -t 8
usw.)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 sponge
finden Sie unter man sponge
undGibt 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.
sponge
ist 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