我试图用相同数量的行和来自另一个文件(file2)的相同位置替换一个文件(file1)中的行。我发现
sed -n 1,5p file2
Run Code Online (Sandbox Code Playgroud)
将从file2 中提取前五行。如何使用这些行并替换file1 中的前五行?
对于使用 GNU 进行就地编辑sed,有一个-i选项。该READ线命令,(它读取一个文件名为一行,则后再次运行时,每行),在这里很有用。两行版本:
sed -i '1,5{R file2
d}' file1
Run Code Online (Sandbox Code Playgroud)
笔记:
Read line的输出不会被d后面的 elete改变。 在从file1删除一行后R插入来自file2 的 每一行。在不能先走,(如果它这样做了,命令将不会运行,就像是在) ddRdnextawk
该READ线(比如到文件名中的所有命令),需要的文件名由换行符分隔。通常的;命令分隔符被忽略,R解释R file2;为以文字“ ;”结尾的文件名。与空格相同,R解释R file2 ;为以文字“ ;”结尾的文件名
R不受 影响-i,因此不会更改file2。
为了将其放在一行上,可以传递两个与换行符连接以形成脚本的-expressions :sedsed
sed -i -e '1,5{R file2' -e 'd}' file1
Run Code Online (Sandbox Code Playgroud)
否则,您不需要sed:
{ head -n 5 file2; tail -n +6 file1; } > file3
Run Code Online (Sandbox Code Playgroud)
在一般情况下,以取代$x1以$y1线file1带$x2,以$y2线file2:
sed "$x2,\$!d;$y2 q" file2 | sed -i -e "$x1 r /dev/stdin" -e "$x1,$y1 d" file1
Run Code Online (Sandbox Code Playgroud)
或者:
{
head -n "$((x1 - 1))"
tail -n "+$x2" < file2 | head -n "$((y2 - x2 + 1))"
tail -n "+$((y1 - x1 + 2))"
} < file1 > file3
Run Code Online (Sandbox Code Playgroud)
有点作弊(不是纯粹的sed),使用sponge:
{ sed -n 1,5p file2 ; sed -n '6,$p' file1 } | sponge file1
Run Code Online (Sandbox Code Playgroud)