繁体   English   中英

如何用另一个文件中的内容替换一个文件中第XX行之后的所有行?

[英]How do I replace all lines after line XX in one file with content from another file?

我使用的是Debian 8.2。 到目前为止,这里是test.sh

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

我想从文件fileA的内容开始的第26行替换fileB从第26行开始的所有内容-所以我最后输出的前25行是从原始fileB第1-25行开始,其余的是从行26开始fileA

我该怎么做呢?

如果您想要整个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 ''进行指定。


这个问题已得到澄清,因此需要线原来的1-25 fileB和线原来的26 EOF fileA输出文件fileB 这有点奇怪,尤其是因为进程替换仅在引号之外起作用。 /dev/stdin可用的系统上(大多数类似Unix的系统),可以使用:

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

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

注意:此答案的先前版本使用25r而不是26r 这是一个一次性的错误,现已修复。

#!/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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM