Com sed
, você precisaria de um loop como:
sed -e :1 -e 's/^\( *\) /-/; t1' < file
Ou faça algo como:
sed '
s/ */&\
/; # add a newline after the leading spaces
h; # save a copy on the hold space
y/ /-/; # replace *every* space with -
G; # append our saved copy
s/\n.*\n//; # remove the superflous part' < file
Com perl
, você pode fazer coisas como:
perl -pe 's{^ *}{$& =~ y/ /-/r}e' < file
ou
perl -pe 's/(^|\G) /-/g' < file
\G
em correspondências PCRE (com largura zero) no final da correspondência anterior (em //g
contexto). Então, aqui, estamos substituindo um espaço que segue o início da linha ^
ou o final da correspondência anterior (ou seja, o espaço substituído anteriormente).
(esse também funcionaria com sed
implementações que suportam PCREs como ssed -R
).
Com awk
, você pode fazer algo como:
awk '
match($0, /^ +/) {
space = substr($0, 1, RLENGTH)
gsub(" ", "-", space)
$0 = space substr($0, RLENGTH+1)
}
{print}' < file
Se você quiser converter também as guias (onde, por exemplo, <space><tab>foo
seria convertido em --------foo
), você poderá pré-processar a entrada com expand
. Com o GNU expand
, você pode torná-lo expand -i
, de modo que apenas as guias entre os espaços em branco iniciais na linha sejam convertidas. Você pode especificar a distância entre as paradas de tabulação (a cada 8 colunas, por padrão) com a opção -t
.
Para generalizar isso para todos os caracteres de espaçamento horizontal, ou pelo menos aqueles que estão na categoria [:blank:]
em sua localidade, isso se torna mais complicado.
Se não fosse pelo caractere TAB, seria apenas uma questão de:
perl -Mopen=locale -MText::CharWidth=mbswidth -pe 's/^\h+/"-" x mbswidth($&)/e'
Mas o caractere TAB que é um caractere controle tem uma largura de -1
com esse mbswidth()
, enquanto na realidade ele tem uma largura variável de 1 a 8 colunas dependendo de onde ele é encontrado na linha.
O comando expand
cuida de expandi-lo para o número de espaços correto , mas várias implementações, incluindo o GNU expand
, não acertam quando há caracteres multi-byte ( como todos os caracteres em branco, exceto aba, espaço em locales UTF-8), e até mesmo alguns que suportam caracteres de múltiplos bytes podem ser enganados por caracteres de largura zero ou de largura dupla (como U + 3000, que está no[:blank:]
% de classes em locais típicos do GNU, pelo menos). Então, seria necessário fazer a expansão da tabulação manualmente:
perl -Mopen=locale -MText::CharWidth=mbswidth -pe 's{^\h+}{
$s = $&;
while ($s =~ /(.*?)\t(.*)/) {
$s = $1 . (" " x ((7-mbswidth($1)) % 8 + 1)) . $2;
}
"-" x mbswidth($s)}e'