使用 sed 将文件中的前 n 行替换为另一个文件中的前 n 行(例如 n=5)

Pav*_*van 5 sed

我试图用相同数量的行和来自另一个文件(file2)的相同位置替换一个文件(file1)中的行。我发现

sed -n 1,5p file2
Run Code Online (Sandbox Code Playgroud)

将从file2 中提取前五行。如何使用这些行并替换file1 中的前五行

Sté*_*las 9

对于使用 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)


agc*_*agc 3

有点作弊(不是纯粹的sed),使用sponge

{ sed -n 1,5p file2 ; sed -n '6,$p' file1 } | sponge file1
Run Code Online (Sandbox Code Playgroud)