Respuestas:
La secuencia de comandos que publicó convierte 4 * n espacios en n pestañas, solo si esos espacios van precedidos solo por pestañas.
Si desea reemplazar 4 espacios por 2 espacios, pero solo en sangría, aunque es posible hacerlo con sed, recomiendo Perl en su lugar.
perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file
En sed:
sed -e 's/^/~/' -e ': r' -e 's/^\( *\)~ /\1 ~/' -e 't r' -e 's/~//' file
Es posible que desee utilizar indent
en su lugar.
No funciona la forma directa:
sed -r 's/ {4}/ /g'
Si no, publique alguna entrada donde falla.
Si solo se van a convertir los espacios iniciales:
sed 'h;s/[^ ].*//;s/ / /g;G;s/\n *//'
Con comentarios:
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'
También mire la 'ts'
configuración y el :retab
comando de vim
'ts'
y :retab
no son soluciones a la pregunta, pero están relacionadas y pueden ayudar a abordar su objetivo general. Puedes hacer vim -- *.c
, :set ts=...
y luego :argdo retab
o :argdo retab!
. Consulte también la 'sw'
opción y las capacidades de sangría propias de vim.
sed 's/^\( \+\)\1\1\1/\1\1/' file
Funciona dividiendo los espacios iniciales en cuatro instancias del mismo grupo (para que todos sean iguales) y luego reemplazándolos con solo dos instancias del grupo.
\+
). Gracias.
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.