Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何将一个文件中XX行之后的所有行替换为另一个文件中的内容?_Linux_Bash_Shell - Fatal编程技术网

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

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://

我用的是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://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
处理“无备份”;这对他们两个(全部?)都有效。如果您使用GNU
sed
-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
处理“无备份”;这对他们两个(全部?)都有效。如果您使用GNU
sed
-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
产生的输出有什么不同?@ReubenL
wget
也可以写入标准输出。只是
wget-qO-
@Username:以后,请像我刚才做的那样,在问题中添加关键的澄清信息(或者类似的,如果你不喜欢我说的话,请编辑它),不要将其作为评论添加。谢谢。最明显的方法是
cat,我会使用curl来减少对温度的需要files@ReubenL. 我对壳牌公司不熟悉。
wget
curl
产生的输出有什么不同?@ReubenL
wget
也可以写入标准输出。只是
wget-qO-
@Username:以后,请像我刚才做的那样,在问题中添加关键的澄清信息(或者类似的,如果你不喜欢我说的话,请编辑它),不要将其作为评论添加。谢谢。
sed-i-n'1,25p'文件b
将避免临时文件。
sed-i-n'1,25p'文件b
将避免临时文件。