将一个文件的前 7 行替换为另一个文件的内容

giv*_*ivi 3 text-processing

我有两个文件。一个是叫file1.txt,另一个是person1.txt。它们都包含一些文本行,如下例所示:

我想要做的是将前七行代码替换file1.txtperson1.txt.

我怎样才能做到这一点?

Whi*_*Owl 14

cp person1.txt result.txt
tail -n+8 file1 >> result.txt
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 8

使用 GNUsponge进行就地编辑file1.txt

{ cat person1.txt; tail -n +8 file1.txt; } | sponge file1.txt
Run Code Online (Sandbox Code Playgroud)

这会将person1.txt文件与文件中除前 7 行之外的所有行连接起来file1.txt,并将结果保存到file1.txt.

对于sed,您会执行相同的操作

sed -e '1r person1.txt' -e '1,7d' file1.txt | sponge file1.txt
Run Code Online (Sandbox Code Playgroud)

(您可以使用8,$!d代替1,7d),或者,如果使用 GNU sed

sed -i -e '1r person1.txt' -e '1,7d' file1.txt
Run Code Online (Sandbox Code Playgroud)

person1.txt这会在开头插入 的内容,然后跳过file1.txt输入文件的前七行。


Adm*_*Bee 8

另一种可能性是awk

awk 'NR==FNR || FNR>7' person1.txt file1.txt > result.txt
Run Code Online (Sandbox Code Playgroud)

这将先处理person1.txt然后再处理file1.txt。如果有的话,它将打印当前行

  • 我们正在处理两个文件中的第一个,其中NR(全局行计数器)等于FNR,每个文件的行计数器,或者
  • 每个文件的行计数器大于 7(这仅是处理第二个文件时的限制,现在NR大于FNR

您甚至可以将其扩展为要跳过的每个文件的行规范:

awk -- '--skip<=0' person1.txt skip=7 file1.txt skip=4 file2.txt >result.txt
Run Code Online (Sandbox Code Playgroud)

然后,您只需在每个文件名之前添加一个变量赋值,将变量设置awkskip您想要从相应输入文件中跳过的行数。程序awk针对每个已处理的行检查此变量(如果递减 1)是否低于零,这表明已达到要跳过的行数。那么条件将是true, 并打印当前行。

请注意,--需要“选项结束”说明符,因为实际程序的第一个命令以--.


ica*_*rus 7

这可以通过以下方式完成sed

步骤是删除前 6 行。当你到达第七行时,你需要读入另一个文件,然后删除第七行。

sed '1,6d
7{
r person1.txt
d
} ' file1.txt > newfile1.txt &&
mv newfile1.txt file1.txt
Run Code Online (Sandbox Code Playgroud)

某些版本sed有一个-i标志来进行“就地”编辑。

另一种方法是使用tail.

{
    cat person1.txt
    tail -n +8 file1.txt
} > newfile1.txt && mv -f newfile1.txt file1.txt
Run Code Online (Sandbox Code Playgroud)

这里将两个命令放在一起,并将输出重定向到一起。

  • 或者 `sed -e 7rfile2 -e 1,7d` (2认同)