Substitui uma série de caracteres por um número igual de caracteres

2

Eu quero substituir as strings que contêm caracteres de til de comprimentos variados com strings de espaços. Por exemplo, se uma string contiver 5 caracteres de til: ~~~~~ , quero substituí-la por 5 espaços.

Meu atual comando sed :

sed -e '/\begin{alltt}/,/\end{alltt}/s/~\+/ /' test.tex

Eu posso verificar um ou mais caracteres de til, mas não sei como recuperar o tamanho para inserir os espaços

    
por Tu Do 21.02.2017 / 14:21

1 resposta

5
sed '/\begin{alltt}/,/\end{alltt}/s/~/ /g'

Substituiria todo o ~ s por espaços. Se você quisesse substituir apenas o ~ s da primeira sequência de ~ s em cada linha, você poderia fazer:

sed '
  /\begin{alltt}/,/\end{alltt}/{
    /~/ {
      h; # save a copy
      s/\(~\{1,\}\).*//; # remove everything after the first sequence of ~s
      s/~/ /g; # replace ~s with spaces
      G; # append the saved copy
      s/\n[^~]*~*//; # retain only what's past the first sequence of ~s
                     # from the copy
    }
  }'

Observação: \{1,\} é o equivalente padrão de sua extensão \+ GNU.

É mais fácil com perl :

perl -pe 's{~+}{$& =~ s/~/ /gr}e if /\begin\{alltt\}/ .. /\end\{alttt\}/'

ou:

perl -pe 's{~+}{" " x length$&}e if /\begin\{alltt\}/ .. /\end\{alttt\}/'
    
por 21.02.2017 / 14:33

Tags