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

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

我正在尝试替换一个文件中的行(文件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

在一般情况下,将$x1to$y1行替换file1$x2to$y2file2

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

相关内容