使用sed将文件指定行替换为另一文件内容的问题求解
问题原因
问题出在sed的命令执行顺序上:d删除命令执行后会立即清空当前模式空间,直接跳转到下一行的处理流程,排在d之后的r读文件命令没有执行机会,因此foo.txt的内容不会输出。
解决方法
方法1:调整sed内部命令顺序(最简兼容方案)
将r命令放在d命令之前执行即可。r命令会先把读取到的文件内容加入输出队列,再用d删除原匹配行,即可实现行替换效果,修改后的sed语句如下:
sed -e '/b/ { r /dev/stdin d }' "template.txt" < "foo.txt"
运行后输出结果为:
a Hello, World! c
方法2:用awk实现(逻辑更直观)
如果后续需要扩展更复杂的处理逻辑,awk的写法更易懂,不容易踩sed的命令顺序坑:
awk ' NR == FNR { replace_content = replace_content $0 "\n"; next } /b/ { printf "%s", replace_content; next } 1 ' foo.txt template.txt
这段逻辑先读取foo.txt的全部内容存为变量,匹配到目标行时输出存储的替换内容、跳过原行,其余行正常输出。
内容的提问来源于stack exchange,提问作者sshine
相关产品推荐
相关产品推荐

