![使用 sed 将一个文件中的前 n 行替换为另一个文件中的前 n 行(假设 n=5)](https://linux22.com/image/122053/%E4%BD%BF%E7%94%A8%20sed%20%E5%B0%86%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%89%8D%20n%20%E8%A1%8C%E6%9B%BF%E6%8D%A2%E4%B8%BA%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%89%8D%20n%20%E8%A1%8C%EF%BC%88%E5%81%87%E8%AE%BE%20n%3D5%EF%BC%89.png)
我正在尝试替换一个文件中的行(文件1)与另一个文件具有相同的行数和相同的位置(文件2)。我发现
sed -n 1,5p file2
将从中提取前五行文件2。我如何使用这些行并替换其中的前五行文件1?
答案1
对于使用 GNU 进行就地编辑sed
,有一个-i
选项。这R
头线命令(从命名文件中读取一行,然后再次运行时读取该行之后的每一行)在这里很有用。两线版本:
sed -i '1,5{R file2
d}' file1
笔记:
R
头线的输出不会改变d
埃莱特接下来。R
插入每一行文件2 后d
从中删除一行文件1。不能d
先走,(如果先走,R
命令将不会运行,d
就像next
在 中awk
)这
R
头线(与所有采用文件名的命令一样)要求文件名由换行符分隔。通常的;
命令分隔符被忽略,R
解释R file2;
为以文字“;
”结尾的文件名。与空格相同,R
解释R file2 ;
为以文字“;
”结尾的文件名R
不受 影响-i
,所以文件2不会被改变。
为了适应它一条线,可以传递两个-e
表达式,它们sed
与换行符连接起来形成sed
脚本:
sed -i -e '1,5{R file2' -e 'd}' file1
否则,您不需要sed
:
{ head -n 5 file2; tail -n +6 file1; } > file3
在一般情况下,将$x1
to$y1
行替换file1
为$x2
to$y2
行file2
:
sed "$x2,\$!d;$y2 q" file2 | sed -i -e "$x1 r /dev/stdin" -e "$x1,$y1 d" file1
或者:
{
head -n "$((x1 - 1))"
tail -n "+$x2" < file2 | head -n "$((y2 - x2 + 1))"
tail -n "+$((y1 - x1 + 2))"
} < file1 > file3
答案2
有点作弊,(不纯粹sed
),使用sponge
:
{ sed -n 1,5p file2 ; sed -n '6,$p' file1 } | sponge file1
答案3
使用 tmp 文件怎么样?
sed -n ‘1,5p’ file2 > file3 ; sed ‘1,5d’ file1 >> file3 ; mv file3 file1