Risposte:
Lo script che hai pubblicato converte 4 * n spazi in n tab, solo se tali spazi sono preceduti solo da tab.
Se vuoi sostituire 4 spazi con 2 spazi, ma solo nella rientranza, mentre è possibile farlo con sed, consiglio invece 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
Potresti voler usare indentinvece.
Il modo semplice non funziona:
sed -r 's/ {4}/ /g'
In caso contrario, pubblica alcuni input dove non riesce.
Se devono essere convertiti solo gli spazi iniziali:
sed 'h;s/[^ ].*//;s/ / /g;G;s/\n *//'
Con commenti:
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'
Guarda anche le 'ts'impostazioni e il :retabcomando di vim
'ts'e :retabnon sono soluzioni alla questione, ma sono legate e possono contribuire ad affrontare il vostro obiettivo generale. Puoi fare vim -- *.c, :set ts=...e poi :argdo retabo :argdo retab!. Vedi anche l' 'sw'opzione e le capacità di rientro di vim.
sed 's/^\( \+\)\1\1\1/\1\1/' file
Funziona dividendo gli spazi iniziali in quattro istanze dello stesso gruppo (quindi sono tutti uguali) e quindi sostituendoli con solo due istanze del gruppo.
\+). Grazie.
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.