我有一个文本文件,我想将行添加到文件中,排列如下;
#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
要就地编辑文件,请替换awk
为gawk
并添加-i /usr/share/awk/inplace.awk
1 选项(并将文件路径作为参数传递,而不是将其内容提供给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
使用zsh
或ksh93
代替bash
,您还可以使用以下命令生成该文本:
printf '#define ICFG%d %#x\n' {0..255}{,"*4+0x2000"}
bash
就像ksh93
复制{0..255}
from 一样zsh
,但不接受参数 to 中的任意算术表达式printf
,因此您需要在那里使用循环。
^不使用-i inplace
as尝试首先从当前工作目录gawk
加载inplace
扩展(asinplace
或),有人可能已经在其中植入了恶意软件。随系统提供的扩展inplace.awk
的路径可能会有所不同,请参阅输出inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'