如何用sed将a.py第3行及以后内容替换b.py对应行?
解决方案
方法1:结合head和sed(直观易懂)
这种方法先提取b.py的前2行,再提取a.py第3行及之后的内容,合并后覆盖b.py:
{ head -n 2 b.py; sed -n '3,$p' a.py; } > temp.py && mv temp.py b.py
head -n 2 b.py:提取b.py的前2行sed -n '3,$p' a.py:提取a.py从第3行到末尾的所有内容- 把两部分内容输出到临时文件
temp.py,再替换原b.py(用临时文件是避免直接覆盖时的文件损坏风险)
方法2:用sed单命令实现
如果偏好只用sed完成,可以通过读取外部内容并删除原文件后续行来实现替换:
sed '3,$ { r /dev/stdin d }' b.py < <(sed -n '3,$p' a.py)
或者写成单行形式:
sed -e '3,${r /dev/stdin' -e 'd;}' b.py < <(sed -n '3,$p' a.py)
- 对b.py的第3行到末尾的行,先读取标准输入(即a.py的目标内容),再用
d命令删除当前行,从而实现替换而非插入 - 如果需要直接修改b.py文件,可以添加
-i参数(GNU sed支持-i,BSD sed需要写成-i ''):
sed -i '3,$ { r /dev/stdin; d; }' b.py < <(sed -n '3,$p' a.py)
原命令失效原因
你之前用的sed -n 3r<(sed -n '3,$p' a.py) b.py,本质是在b.py的第3行之后插入a.py的内容,而b.py原有的第3行及之后的内容并未被删除,所以最终结果是插入而非替换,不符合需求。
内容的提问来源于stack exchange,提问作者user2236600
相关产品推荐
相关产品推荐

