数値が増える行をファイルに追加

数値が増える行をファイルに追加

テキストファイルがありますが、次のようにファイルに行を追加したいと思います。

#define ICFGx     0x2y

ここで、xは0から始まり255で終わる10進数で、各行に1つ増加します。 yは000で始まり3FCで終わる16進数で、行ごとに0x004増加します。

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

また、特定の行、たとえば500行から始めて追加したいと思います。

コマンドラインでこれを行う方法はありますか?私はLinuxターミナルを初めて使用し、まだbashスクリプトを書いていません。

答え1

Bashでは、これを使用してprintf出力形式を指定できます。

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

%d3サイズを表す10進整数を表し、マイナス記号は左揃えを表します。長さを表すX16進数の大文字を表し、ゼロで埋められることを示します。算術拡張を紹介します。30$(( ... ))

sedファイルに挿入するだけでなく、

sed -i~ 500rinsert.txt input.txt

あるいは、Perlを使用することもできます。

perl -i~ -pe 'if ($. == 500) {
    printf "#define  ICFG%-3d     0x2%03X\n", $_, $_ * 4 for 0 .. 255 }
' -- input.txt
  • $.入力行番号です。
  • 印刷機能動作はbashの動作と似ています(少なくとも、および%-3dの場合%03X)。

答え2

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

ファイルを所定の位置に編集するには:1オプションawkで置き換えてgawk追加します(コンテンツを提供するstdinの-i /usr/share/awk/inplace.awk代わりにファイルパスを引数として渡します)。awk

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

zsh代わりに、ksh93次のようにbashテキストを生成することもできます。

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

bashfromからksh93コピーするのと同じですが、引数に任意の算術式を許可しないため、そこでループを使用する必要があります。{0..255}zshprintf


^使用しないでください-i inplace現在の作業ディレクトリから最初に拡張機能をgawkロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

関連情報