Como preencher strings com espaços em um script de shell Unix?

3

Eu tenho dados parecidos com isto:

01234567
09876544
12345676
34576980

Eu preciso preencher isso com 11 espaços, ou seja, minha saída deve ficar assim:

'           01234567' 
'           09876544'
'           12345676'
'           34576980'

Como posso fazer isso usando o shell script do UNIX?

    
por user239225 19.07.2013 / 12:12

5 respostas

10

Estou assumindo / adivinhando que os apóstrofos não devem ser incluídos na saída.

Solução shell padrão, em que infile é o arquivo que contém a entrada:

while read i; do printf "%19s\n" "$i"; done < infile

em que 19 é o comprimento da string por linha, como são dados (8) mais o preenchimento desejado (11). Eu estou novamente supondo que esse tipo de preenchimento é o que você quer, e não apenas prefixando 11 espaços em todas as linhas. Se este não for o caso, você precisa dar um exemplo específico de como as linhas de entrada de comprimento diferente devem ser tratadas.

Se os apóstrofos foram feitos para serem incluídos:

while read i; do printf "'%19s'\n" "$i"; done < infile
    
por 19.07.2013 / 14:17
3

Uma opção mais curta do GNU coreutils é o comando pr :

pr -T -o 11 foo.txt

Trecho da página man:

DESCRIPTION
       Paginate or columnate FILE(s) for printing.

       -o, --indent=MARGIN
              offset each line with MARGIN (zero) spaces

       -T, --omit-pagination
              omit page headers and trailers, eliminate any pagination by form feeds set in input files
    
por 19.01.2017 / 16:17
0

Você pode usar o Ex-editor (Vi), seja alterando o arquivo no local:

ex -s +"%s@^@    @" -cwq foo.txt

ou analisando a entrada padrão e imprimindo-a na saída padrão:

cat foo.txt | ex -s +"%s@^@    @" +%p -cq! /dev/stdin
    
por 11.09.2015 / 01:23
0

Supondo que os dados estão em um arquivo de texto:

    $ cat file.txt 
    01234567
    09876544
    12345676
    34576980

Use o comando sed ou o one-liner Perl da seguinte forma:

    $ sed -n "s#^\(.*\)#\'           \'#p" file.txt
    '           01234567'
    '           09876544'
    '           12345676'
    '           34576980'

-n :    By default, each line of input is echoed to the standard output after 
        all of the commands have been applied to it.  The -n option suppresses
        this behavior.
 p :    Print the current pattern space.


    $ perl -p -e "s#^(.*)#\'           \\'#" file.txt
    '           01234567'
    '           09876544'
    '           12345676'
    '           34576980'

−p: Assumes an input loop around the script. Lines are printed.
−e commandline:
May be used to enter a single line of script. Multiple −e commands
build up a multiline script.

Eu tentei esses comandos no Ubuntu Linux.

    
por 09.08.2016 / 15:54
-1

Este é um fornecimento para a resposta do @Daniel Andersson, caso a duração de cada linha lida de um arquivo varie, você pode fazer o seguinte:

while read i; do printf "%11s%s\n" "" "$i"; done < infile
    
por 20.09.2018 / 04:10