Linux 如何将一个文件中XX行之后的所有行替换为另一个文件中的内容?
我用的是Debian 8.2。下面是到目前为止的Linux 如何将一个文件中XX行之后的所有行替换为另一个文件中的内容?,linux,bash,shell,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行是从原始fileB的第1-25行开始的,剩余的是fileA的第26行 我该怎么做 #!/bin/bash wget http://
test.sh
#!/bin/bash
wget http://winhelp2002.mvps.org/hosts.txt -O fileA
tail -n +26 fileA >> fileB
我希望从fileA
的内容开始的第26行替换从第26行开始的fileB
中的所有内容-因此我最终得到输出的前25行是从原始fileB
的第1-25行开始的,剩余的是fileA
的第26行
我该怎么做
#!/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
head-25
将从fileB获取前25行并将其转储到tempfile。然后tempfile将重命名为fileB 如果您想要整个文件a
,您可以使用:
sed -i.bak -e '26r fileA' -e '26,$d' fileB
sed 1,25d fileA | sed -i.bak -e '26r /dev/stdin' -e '26,$d' fileB
这将在读取第26行之后(但在打印或以其他方式处理之前),将fileA
的内容读取到输出中;然后删除fileB
末尾的第26行。-i.bak
选项意味着fileB
将被命令的输出覆盖(但备份副本的后缀为.bak
)。不同版本的sed
使用-i
处理“无备份”;这对他们两个(全部?)都有效。如果您使用GNUsed
,-i本身就足够了;如果使用Mac OS X(BSD)sed
,则需要-i'
来指定它
问题已经澄清,因此需要原始fileB
的第1-25行和输出文件fileB
中原始fileA
的第26-EOF行。这有点复杂,不仅仅是因为它只在引号外起作用。在/dev/stdin
可用的系统上(大多数类Unix系统),您可以使用:
sed -i.bak -e '26r fileA' -e '26,$d' fileB
sed 1,25d fileA | sed -i.bak -e '26r /dev/stdin' -e '26,$d' fileB
第一个sed
命令删除fileA
的第1-25行,并将结果(第26-EOF行)写入其标准输出,这是第二个sed
命令的标准输入。当文件到达fileB
的第26行时,第二个sed
命令从/dev/stdin
读取该文件,然后删除fileB
的第26-EOF行,并像以前一样进行覆盖
注意:这个答案的前一个版本使用了25r
而不是26r
;这是一个一次关闭的错误,现已修复。如果您需要整个文件a
,可以使用:
sed -i.bak -e '26r fileA' -e '26,$d' fileB
sed 1,25d fileA | sed -i.bak -e '26r /dev/stdin' -e '26,$d' fileB
这将在读取第26行之后(但在打印或以其他方式处理之前),将fileA
的内容读取到输出中;然后删除fileB
末尾的第26行。-i.bak
选项意味着fileB
将被命令的输出覆盖(但备份副本的后缀为.bak
)。不同版本的sed
使用-i
处理“无备份”;这对他们两个(全部?)都有效。如果您使用GNUsed
,-i本身就足够了;如果使用Mac OS X(BSD)sed
,则需要-i'
来指定它
问题已经澄清,因此需要原始fileB
的第1-25行和输出文件fileB
中原始fileA
的第26-EOF行。这有点复杂,不仅仅是因为它只在引号外起作用。在/dev/stdin
可用的系统上(大多数类Unix系统),您可以使用:
sed -i.bak -e '26r fileA' -e '26,$d' fileB
sed 1,25d fileA | sed -i.bak -e '26r /dev/stdin' -e '26,$d' fileB
第一个sed
命令删除fileA
的第1-25行,并将结果(第26-EOF行)写入其标准输出,这是第二个sed
命令的标准输入。当文件到达fileB
的第26行时,第二个sed
命令从/dev/stdin
读取该文件,然后删除fileB
的第26-EOF行,并像以前一样进行覆盖
注意:这个答案的前一个版本使用了25r
而不是26r
;这是一个一个接一个的错误,现在已经修复。最明显的方法是cat,我将使用curl来减少对temp的需要files@ReubenL. 我对壳牌公司不熟悉。wget
与curl
产生的输出有什么不同?@ReubenLwget
也可以写入标准输出。只是wget-qO-
@Username:以后,请像我刚才做的那样,在问题中添加关键的澄清信息(或者类似的,如果你不喜欢我说的话,请编辑它),不要将其作为评论添加。谢谢。最明显的方法是cat,我会使用curl来减少对温度的需要files@ReubenL. 我对壳牌公司不熟悉。wget
与curl
产生的输出有什么不同?@ReubenLwget
也可以写入标准输出。只是wget-qO-
@Username:以后,请像我刚才做的那样,在问题中添加关键的澄清信息(或者类似的,如果你不喜欢我说的话,请编辑它),不要将其作为评论添加。谢谢。sed-i-n'1,25p'文件b
将避免临时文件。sed-i-n'1,25p'文件b
将避免临时文件。