Acrescentar linhas com incremento de números em um arquivo

1

Eu tenho um arquivo de texto e gostaria de adicionar linhas ao arquivo organizado da seguinte forma:

#define ICFGx     0x2y

em que x é um número decimal que começa em 0 e termina em 255, incrementando em 1 com cada linha e y é um número hexadecimal que começa em 000 e termina em 3FC, incrementando em 0x004 com cada linha.

#define ICFG0     0x2000
#define ICFG1     0x2004
#define ICFG2     0x2008
#define ICFG3     0x200C

Eu também gostaria de adicioná-los de uma certa linha, digamos, a linha 500.

Existe alguma maneira de executar essa tarefa a partir da linha de comando? Eu sou relativamente novo em usar o terminal linux e ainda não fiz muito bash scripting.

    
por Ca01an 20.09.2018 / 17:01

2 respostas

1

No bash, você pode usar printf para formatar a saída.

for i in {0..255} ; do
    printf "#define  ICFG%-3d     0x2%03X\n" $i $((i*4))
done > insert.txt

%d significa um inteiro decimal, 3 é o tamanho, o significa menos alinhado à esquerda. X significa hexadecimal de maiúsculas, 3 é o comprimento, 0 significa 0-preenchido. $(( ... )) introduz expansão aritmética.

Apenas use sed para inseri-lo em seu arquivo

sed -i~ 500rinsert.txt input.txt

Ou você pode usar o Perl:

perl -i~ -pe 'if ($. == 500) {
    printf "#define  ICFG%-3d     0x2%03X\n", $_, $_ * 4 for 0 .. 255 }
' -- input.txt
  • $. é o número da linha de entrada
  • printf se comporta de maneira semelhante à do bash (pelo menos para %-3d e %03X )
por 20.09.2018 / 17:12
1
awk '{print}; FNR == 500 {for (i  = 0; i < 256; i++)
  printf "#define ICFG%d\t%#x\n", i, 0x2000 + i*4}' < file.h

Para editar o arquivo no local, substitua awk por gawk e adicione uma opção -i inplace (e passe o caminho do arquivo como argumento em vez de alimentar seu conteúdo no arquivo awk ):

gawk -i inplace '{print}; FNR == 500 {for (i  = 0; i < 256; i++)
  printf "#define ICFG%d\t%#x\n", i, 0x2000 + i*4}' file.h

Com zsh ou ksh93 em vez de bash , você também pode gerar esse texto com:

printf '#define ICFG%d %#x\n' {0..255}{,"*4+0x2000"}

bash como ksh93 copiou o {0..255} de zsh , mas não aceita expressões aritméticas arbitrárias em argumentos para printf , então você precisa usar um loop lá.

    
por 20.09.2018 / 17:12