如何将一行文件中XX行后的所有行替换为另一个文件中的内容?

时间:2015-12-22 04:54:26

标签: linux bash shell

我在Debian 8.2上。到目前为止,这里test.sh

#!/bin/bash
wget http://winhelp2002.mvps.org/hosts.txt -O fileA
tail -n +26 fileA >> fileB

我希望fileA内容的第26行以后从第26行开始替换fileB中的所有内容 - 所以我最后输出的第25行来自第1行原始fileB的-25,其余为fileA的第26行。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

如果你想要整个fileA,你可以使用:

sed -i.bak -e '26r fileA' -e '26,$d' fileB

在读取第26行之后(但在打印或以其他方式处理之前)将fileA的内容读入输出中;然后删除第26行到fileB的末尾。 -i.bak选项表示fileB被命令输出覆盖(但备份副本使用后缀.bak)。不同版本的sed-i处理“无备份”;这将适用于它们(全部?)。如果你使用GNU sed-i就足够了;如果您使用Mac OS X(BSD)sed,则需要-i ''来指定它。

问题已得到澄清,因此需要原始fileB的第1-25行和输出文件fileA中原始fileB的第26-EOF行。这有点繁琐,尤其是因为process substitution只能在引号之外工作。在/dev/stdin可用的系统(大多数类Unix系统)上,您可以使用:

 sed 1,25d fileA | sed -i.bak -e '26r /dev/stdin' -e '26,$d' fileB

第一个sed命令删除fileA的第1-25行并将结果(第26-EOF行)写入其标准输出,这是第二个sed的标准输入命令。第二个sed命令在/dev/stdin到达fileB的第26行时从fileB读取文件,然后删除25r的第26-EOF行,并覆盖以前。

注意:此答案的先前版本使用26r代替saveHTML(){animation};这是一个现在修复的一个错误。

答案 1 :(得分:2)

#!/bin/bash
wget http://winhelp2002.mvps.org/hosts.txt -O fileA
head -25 fileB > tempfile && mv tempfile fileB
tail -n +26 fileA >> fileB

head -25将从fileB获取前25行并将其转储到tempfile。然后tempfile将重命名为fileB。