我在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行。
我该怎么做?
答案 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。