如何使用awk或sed将file1每行内容插入到file2命令行指定位置
实现方法
直接用awk处理双文件是最简洁稳定的方案,可自动兼容带引号、含空格的条目,不需要额外转义处理。
awk 实现命令
awk ' NR==FNR { gsub(/^[[:space:]]+|[[:space:]]+$/, "", $0) if ($0 != "") entries[++n] = $0 next } { for (i=1; i<=n; i++) { print gensub(/(name)[[:space:]]+(devices)/, "\\1 " entries[i] " \\2", "g", $0) } print "" } ' file1 file2 > result.txt
命令逻辑说明
- 读取第一个输入文件
file1时,自动清理每行首尾多余空格、跳过空行,将所有有效条目(包括带引号含空格的内容)完整存入数组,不会因为空格拆分条目。 - 读取第二个输入文件
file2时,遍历所有存好的file1条目,将条目插入到每行命令的name与devices字段之间,完整保留原命令的缩进、设备编号等内容。 - 每处理完一个条目对应的4行命令,自动输出空行做分隔,和示例输出格式一致;如果不需要空行分隔,删掉命令中单独的
print ""行即可。
sed 实现方案
sed本身不支持直接存储跨文件的多组内容,需要先基于file1生成临时替换脚本,再批量处理file2:
# 生成临时sed替换规则 sed -e 's/[[:space:]]*$//' -e '/^$/d' -e 's/^[[:space:]]*/s|name devices|name /' -e 's/$/ devices|/' file1 > temp_rule.sed # 执行替换生成结果 sed -f temp_rule.sed file2 > result.txt # 清理临时文件 rm temp_rule.sed
注意:以上两个命令都可以正确识别带引号的含空格条目,不会出现内容拆分错误,执行完成后结果会写入当前目录下的
result.txt文件。
内容的提问来源于stack exchange,提问作者Ashwin
相关产品推荐
相关产品推荐

