如何用gawk将含INCLUDE的行替换为对应文件名的文件内容?
用gawk实现文件内容嵌入替换
当然可以!gawk完全能轻松实现你要的这种INCLUDE指令替换需求,把指定文件的内容嵌入到主文件对应位置。下面直接给你可行的实现方法和解释:
一行命令搞定
你可以直接在终端运行这条gawk命令,就能处理outer.txt并输出替换后的内容:
gawk '/INCLUDE / { # 提取INCLUDE后面的文件名 file = substr($0, index($0, "INCLUDE ") + 8) # 读取目标文件的每一行并输出 while ((getline line < file) > 0) { print line } # 关闭文件,避免句柄泄漏 close(file) # 跳过当前行的默认输出 next } # 对不匹配INCLUDE的行,直接打印输出 1' outer.txt
命令逻辑拆解
咱们一步步看这个脚本怎么工作:
- 定位目标行:
/INCLUDE /会精准匹配所有包含INCLUDE的行 - 提取文件名:
substr($0, index($0, "INCLUDE ") + 8)先找到INCLUDE在当前行的位置,再跳过这8个字符(刚好是"INCLUDE "的长度),取到行尾就是要嵌入的文件名 - 嵌入文件内容:
while ((getline line < file) > 0) print line循环读取目标文件的每一行,逐行输出到结果里,完美替换掉原来的INCLUDE行 - 清理资源:处理完每个嵌入文件后用
close(file)关闭它,避免同时打开过多文件导致报错 - 处理普通行:最后的
1是gawk的简写语法,代表对所有不匹配INCLUDE的行直接打印,保留原文件的其他内容
直接修改原文件(可选)
如果想把替换后的内容直接写回outer.txt,建议先备份原文件,再用下面的方式(需要安装moreutils包的sponge工具,它会等命令执行完再覆盖原文件,避免损坏):
gawk '...' outer.txt | sponge outer.txt
或者用临时文件中转的方式(不需要额外工具):
gawk '...' outer.txt > temp.txt && mv temp.txt outer.txt
测试你给出的示例文件时,运行这条命令后输出会完全符合你预期的结果:
Blah Blah Blah contents of inner1 Etcetera Etcetera contents of inner2 end of file
内容的提问来源于stack exchange,提问作者gawk_Nube
相关产品推荐
相关产品推荐

