将数字递增的行追加到文件中

将数字递增的行追加到文件中

我有一个文本文件,我想将行添加到文件中,排列如下;

#define ICFGx     0x2y

其中 x 是从 0 开始到 255 结束的十进制数,每行递增 1;y 是从 000 开始到 3FC 结束的十六进制数,每行递增 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

%d表示十进制整数,3是大小,减号表示左对齐。X表示大写十六进制,3是长度,0表示用 0 填充。$(( ... ))引入算术扩展。

不仅仅是用于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

要就地编辑文件,请替换awkgawk并添加-i /usr/share/awk/inplace.awk1 选项(并将文件路径作为参数传递,而不是将其内容提供给awk的 stdin):

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

使用zshksh93代替bash,您还可以使用以下命令生成该文本:

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

bash就像ksh93复制{0..255}from 一样zsh,但不接受参数 to 中的任意算术表达式printf,因此您需要在那里使用循环。


^不使用-i inplaceas尝试首先从当前工作目录gawk加载inplace扩展(asinplace或),有人可能已经在其中植入了恶意软件。随系统提供的扩展inplace.awk的路径可能会有所不同,请参阅输出inplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

相关内容