sed converter 4 espaços para 2

14

Como se converte 4 espaços em 2 espaços com sed ? É possível?

Eu encontrei isso, mas ele converte a guia em espaços:

sed -r ':f; s|^(\t*)\s{4}|\t|g; t f' file

    
por chrisjlee 05.09.2012 / 01:31

5 respostas

13

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, enquanto é possível fazer isso com sed, eu recomendo o Perl.

perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file

No sed:

sed -e 's/^/~/' -e ': r' -e 's/^\( *\)~    /  ~/' -e 't r' -e 's/~//' file

Você pode usar indent em seu lugar.

    
por 05.09.2012 / 01:47
5

O caminho certo não funciona:

sed -r 's/ {4}/  /g'

Se não, poste alguma entrada onde ela falhar.

    
por 05.09.2012 / 09:33
4

Se apenas os espaços iniciais devem ser 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 configuração 'ts' do vim e o comando :retab

    
por 05.09.2012 / 10:49
2
sed 's/^\( \+\)//' file

Funciona dividindo os espaços iniciais em quatro instâncias do mesmo grupo (então, todos são iguais) e, em seguida, substituindo-os por apenas duas instâncias do grupo.

    
por 04.07.2017 / 14:38
1
sed 's/    \{2,4\}\( \{0,1\}[^ ].*\)*/  /g' <input

Isso só deve apertar seqüências de espaços principais.

    
por 10.12.2016 / 15:51

Tags