AIX系统下用文件内容替换行中指定字符串的实现问题
AIX系统下大文件内容替换解决方案
问题背景
- 文件
tmp.txt内容:Hi@@xml-record@@Bye - 需求:将行内的
@@xml-record@@替换为f1.txt的完整内容(f1.txt实际可能是大文件),预期输出:Hifile1Bye - 已尝试命令的问题:
- sed命令未得到预期结果
- 部分awk命令因AIX功能限制无效,或仅在目标行无其他内容时生效
- 可行的awk命令无法处理大文件(需将文件内容存入变量)
可行解决方案
方案1:兼容大文件的awk命令
此方案无需将f1.txt内容存入变量,直接在匹配到标记时输出文件内容,适配AIX环境:
awk 'BEGIN {FS="@@"} /@@xml-record@@/ { printf "%s", $1 system("cat f1.txt") for(i=3; i<=NF; i++) printf "%s%s", (i==3?"":"@@"), $i printf "\n" next } 1' tmp.txt
工作逻辑:
- 以
@@为分隔符拆分每行内容 - 匹配到标记行时,先输出标记前的内容
- 通过
system()调用cat直接输出f1.txt全量内容 - 最后输出标记后的内容,若存在多个
@@分隔段也能正常拼接 - 未匹配的行直接原样输出
方案2:shell+sed组合(适合小到中等大小的f1.txt)
先对f1.txt内容做sed转义处理,再执行替换:
#!/bin/sh # 转义f1.txt中的特殊字符(如/、&),避免sed替换出错 F1_CONTENT=$(sed 's/[\/&]/\\&/g' f1.txt) sed "s/@@xml-record@@/$F1_CONTENT/g" tmp.txt
注意:若f1.txt过大,存入变量可能出现内存问题,优先用方案1。
方案3:ex编辑器命令(需确认AIX ex支持)
若AIX的ex编辑器支持动态替换,可使用简洁的全局替换命令:
ex -sc '%s/@@xml-record@@/\=system("cat f1.txt")/g' -cx tmp.txt
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

