Respostas:
O script que você postou converte 4 * n espaços em n guias, somente se esses espaços forem precedidos apenas por guias.
Se você deseja substituir 4 espaços por 2 espaços, mas apenas em recuo, embora seja possível fazê-lo com sed, eu recomendo o Perl.
perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file
Em sed:
sed -e 's/^/~/' -e ': r' -e 's/^\( *\)~ /\1 ~/' -e 't r' -e 's/~//' file
Você pode usar em seu indent
lugar.
O caminho direto não funciona:
sed -r 's/ {4}/ /g'
Caso contrário, publique alguma entrada onde ela falhar.
Se apenas espaços iniciais forem convertidos:
sed 'h;s/[^ ].*//;s/ / /g;G;s/\n *//'
Com comentários:
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'
Veja também a 'ts'
configuração e o :retab
comando do vim
'ts'
e :retab
não são soluções para a pergunta, mas estão relacionadas e podem ajudar a atingir seu objetivo geral. Você pode fazer vim -- *.c
, :set ts=...
e então :argdo retab
ou :argdo retab!
. Consulte também a 'sw'
opção e os recursos de recuo do vim.
sed 's/^\( \+\)\1\1\1/\1\1/' file
Ele funciona dividindo os espaços iniciais em quatro instâncias do mesmo grupo (para que todos sejam iguais) e depois substituindo-os por apenas duas instâncias do grupo.
\+
). Obrigado.
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.