AWK技术问询:输出文件中间追加文本与生成C风格数组
嘿,刚好这俩问题我都能给你捋明白,一个个来哈:
问题1:用AWK在输出文件中间追加文本
AWK是逐行处理文本的工具,要在文件中间插入内容,核心是先定位到插入点,再输出原有内容的同时插入指定文本。给你两个常用场景的实操例子:
场景1:按指定行数插入
比如要在第3行之后插入一行// 这里是追加的文本,原文件为input.txt,输出到output.txt:
awk 'NR==3 {print; print "// 这里是追加的文本"; next} 1' input.txt > output.txt
简单解释下每个部分:
NR==3:当处理到第3行时触发逻辑print:先输出第3行本身print "// 这里是追加的文本":输出要插入的内容next:跳过后续默认处理,避免重复输出第3行1:AWK中1代表逻辑真,会执行默认的print $0,也就是输出所有其他行
如果要直接修改原文件,GNU AWK支持-i inplace参数直接编辑:
gawk -i inplace 'NR==3 {print; print "// 这里是追加的文本"; next} 1' input.txt
其他系统可以用临时文件中转:awk ... input.txt > temp.txt && mv temp.txt input.txt
场景2:匹配特定内容后插入
如果要在包含START关键字的行后面插入文本,把匹配条件换成正则即可:
awk '/START/ {print; print "// 追加的文本"; next} 1' input.txt > output.txt
问题2:从逗号分隔的HEX文件生成C风格数组
既然你完全不熟悉AWK,我给你写个开箱即用的脚本,再拆解开讲明白,以后你也能自己调整。
方法1:用脚本文件(更易读修改)
把下面的代码存成hex2c.awk:
BEGIN { print "uint8_t ee_data[] = {" count = 0 line_len = 8 # 每行放8个元素,可按需修改数量 } { gsub(/[ \t]/, "") # 移除所有空格、制表符,避免干扰分割 split($0, arr, ",") # 按逗号分割当前行成数组 for (i in arr) { if (arr[i] != "") { # 跳过空元素(比如行尾多余的逗号) printf " %s,", arr[i] count++ if (count % line_len == 0) { # 每line_len个元素换行 print "" } } } } END { if (count % line_len != 0) print "" # 最后一行没满的话补换行 printf "};\n" printf "const size_t ee_data_len = %d;\n", count # 顺便输出元素总数,方便C代码使用 }
然后运行命令生成C数组文件:
awk -f hex2c.awk EE.hex > ee_data.h
方法2:一行命令(不用存脚本)
直接在终端运行:
awk 'BEGIN{print "uint8_t ee_data[] = {"; count=0; line_len=8} {gsub(/[ \t]/,""); split($0,arr,","); for(i in arr){if(arr[i]!=""){printf " %s,",arr[i]; count++; if(count%line_len==0) print ""}}} END{if(count%line_len!=0) print ""; printf "};\nconst size_t ee_data_len = %d;\n", count}' EE.hex > ee_data.h
生成效果示例
用你提供的输入内容,生成的C代码大概是这样:
uint8_t ee_data[] = { 0x01, 0x00, 0x05, 0x00, 0x08, 0x1C, 0x00, 0x58, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x23, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; const size_t ee_data_len = 46;
内容的提问来源于stack exchange,提问作者MCUdude
相关产品推荐
相关产品推荐

