É possível substituir apenas "guias iniciais" por um número definido de espaços por guia? Estou definindo uma guia inicial como aquela que é precedida apenas por tabulações ou espaços. Estou definindo uma guia inicial ou de recuo como uma que é precedida apenas por espaços em branco.
Eu tenho a seguinte linha no meu .nexrc
, cribbed deste aqui . Ele percorre as linhas entre as linhas que contêm a marca a
e a marca b
através de um filtro. que substitui as guias.
map \2 'a!'b pr -te2
No entanto, ele substitui bem as tabulações não iniciais com dois espaços, o que não é ideal, pois às vezes é necessária uma tabulação literal.
Existe uma maneira fácil e portátil de substituir as guias iniciais apenas com um número definido de espaços por guia?
O script perl a seguir (que pode ser reduzido a um one-liner) faz o trabalho de substituir as guias iniciais por uma largura fornecida na linha de comando, mas depende da disponibilidade do Perl e leva tempo quadrático (se o arquivo não consistir em nada mas abas).
#!/usr/bin/env perl
use strict;
use warnings;
my ($width) = @ARGV;
$width //= 2;
my $replacement = ' ' x $width;
while (<>) {
while (s/^(\s*)\t/$1$replacement/g) { }
print;
}
Aqui está um exemplo do que eu quero que aconteça. ^I
refere-se a um byte de tabulação e #
é um marcador de largura zero para o início de uma linha. A linha abaixo é uma régua de bytes.
ANTES DA:
#^I^I ^Ia^Ib
# 1 23 45 67
DEPOIS (largura da guia de 2)
# a^Ib
#12345678 90
DEPOIS (largura da guia de 4)
# a^Ib
#12345678901234 56
Se você estiver procurando por uma solução genérica usando outras ferramentas de linha de comando, poderá usar
Awk
para isso.O comando acima substitui mais uma ocorrência de Tabpor um único espaço, ou seja, 2º argumento em
gsub
. Você pode torná-lo configurável gerando quantos espaços você desejaDesde a última atualização, parece que o OP quer substituir o número de guias principais pelo número exato de espaços encontrados,
A lógica é com a configuração do separador de campo para
\t
, o número de guias iniciais pode ser identificado fazendoNF-1
. Com o número de guias iniciais identificadas, use-o para gerar o mesmo número de espaços dosprintf()
método anterior.Você pode vê-lo verificando o
hexdump -C
antes e depois da substituiçãoagora com a substituição