Antworten:
Das von Ihnen veröffentlichte Skript konvertiert 4 * n Leerzeichen in n Tabulatoren, nur wenn diesen Leerzeichen nur Tabulatoren vorangestellt sind.
Wenn Sie 4 Leerzeichen durch 2 Leerzeichen ersetzen möchten, aber nur in Einrückung, während dies mit sed möglich ist, empfehle ich stattdessen Perl.
perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file
In sed:
sed -e 's/^/~/' -e ': r' -e 's/^\( *\)~ /\1 ~/' -e 't r' -e 's/~//' file
Vielleicht möchten Sie indentstattdessen verwenden.
Funktioniert der einfache Weg nicht:
sed -r 's/ {4}/ /g'
Wenn nicht, posten Sie eine Eingabe, bei der dies fehlschlägt.
Wenn nur führende Leerzeichen konvertiert werden sollen:
sed 'h;s/[^ ].*//;s/ / /g;G;s/\n *//'
Mit Kommentaren:
sed '
h; # save a copy of the pattern space (filled with the current line)
# onto the hold space
s/[^ ].*//; # remove everything starting with the first non-space
# from the pattern space. That leaves the leading space
# characters
s/ / /g; # substitute every sequence of 4 spaces with 2.
G; # append a newline and the hold space (the saved original line) to
# the pattern space.
s/\n *//; # remove that newline and the indentation of the original
# line that follows it'
Schauen Sie sich auch die 'ts'Einstellungen und :retabBefehle von vim an
'ts'und :retabkeine Lösungen für die Frage sind, sondern verwandte und dazu beitragen können, Ihr Gesamtziel zu erreichen. Sie können tun vim -- *.c, :set ts=...und dann :argdo retaboder :argdo retab!. Siehe auch die 'sw'Einrückungsfunktionen von Option und vim.
sed 's/^\( \+\)\1\1\1/\1\1/' file
Es funktioniert, indem die führenden Leerzeichen in vier Instanzen derselben Gruppe aufgeteilt werden (sodass sie alle gleich sind) und dann durch nur zwei Instanzen der Gruppe ersetzt werden.
\+). Vielen Dank.
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.