Localiza (e remove) espaços em branco iniciais comuns a partir de arquivo / pipe

2

Estou procurando uma maneira de encontrar e remover o espaço em branco inicial comum de um fluxo de texto ou arquivo. Eu não quero remover all espaços em branco iniciais (isso seria um simples sed 's/^[[:space:]]*//' ). Apenas a quantidade que é comum a todas as linhas em branco .

Exemplo:

printf '  some text\n\n   some more text\n' | the_awesome_command_or_script

deve imprimir

some text

 some more text

Progresso:

Eu sei que é possível usar ferramentas como awk ou um shell while loop para primeiro fazer o loop em todas as linhas e contar o espaço em branco inicial e, em seguida, excluir o espaço em branco com um comando sed gerado dinamicamente.

O script awk para contar o espaço em branco pode ser semelhante a este

awk 'BEGIN { amount = 0 }
     /^[^[:space:]]/ { print 0; exit }
     /^$/{ next }
     /^[[:space:]]/ { amount = match($0, "[^[:space:]]") - 1 }
     END { print amount }'

Mas preciso de um arquivo temporário e meu script ficaria assim:

generate_some_text | cat > tempfile
amount=$(above_awk_script < tempfile)
sed "s/^[[:space:]]\{$amount\}//" < tempfile
rm tempfile

Perguntas:

Existe uma ferramenta mais adequada para esse trabalho? Posso modificar o script para me livrar do tempfile?

Realidade:

Estou tentando melhorar minha entrada de mailcap para text/html se copiousoutput for solicitado: Atualmente é text/html; elinks -no-home -dump %s; nametemplate=%s.html; copiousoutput; , mas como você deve ter imaginado, eu quero me livrar de alguns espaços em branco iniciais. Talvez eu esteja apenas pensando excessivamente complicado e há uma solução realmente simples para isso?

    
por Lucas 27.04.2016 / 11:35

2 respostas

2

Como são todos os espaços ou todas as guias, você pode canalizá-lo para

sed 'H;$!d;g;: m;/\n[^\n[:blank:]]/!s/\n[^\n]/\n/g;t m;s/.//'

Isso é gnu sed (não acho que outros sed s suportam [\n] ). Ele funciona anexando cada linha ao buffer H old e, em seguida, d , se não for o último ( $! ). Na última linha, copia o conteúdo do espaço de espera sobre o espaço de padrão via g (o conteúdo do espaço de padrão começa com \n ewline agora).
Em seguida, exclui o primeiro caractere em cada linha ( s/\n[^\n]/\n/g ) se nenhuma linha no espaço padrão começar com um espaço não vazio ( /\n[^\n[:blank:]]/! ). Após cada substituição bem-sucedida, ele volta ao rótulo m . Se houver pelo menos uma linha no espaço padrão que comece com um não-branco, apenas removerá a nova linha principal do espaço padrão ( s/.// ) e, em seguida, imprime automaticamente.

    
por 28.04.2016 / 02:30
0

se você está preocupado apenas com a primeira linha da saída, então limite o que o sed procura apenas endereçando a linha 1:

printf ' some text\n\n some more text\n' |sed '1s/^[ \t]*\([^ \t]\+.*\)$//'

isto irá ignorar qualquer espaço em branco no começo e depois combinar de qualquer coisa que não seja espaço em branco mais o resto da linha e somente na linha 1.

    
por 27.04.2016 / 17:45