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

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

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

  • file1.txt
    word1
    word2
    word3
    word4
    word5
    word6
    word7
    word8
    word9
    
  • person1.txt
    givi sixarulidze
    

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

  • 期望的输出:
    givi sixarulidze
    word8
    word9
    

我怎样才能做到这一点?

答案1

cp person1.txt result.txt
tail -n+8 file1 >> result.txt

答案2

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

{ cat person1.txt; tail -n +8 file1.txt; } | sponge file1.txt

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

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

sed -e '1r person1.txt' -e '1,7d' file1.txt | sponge file1.txt

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

sed -i -e '1r person1.txt' -e '1,7d' file1.txt

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

答案3

另一种可能性是awk

awk 'NR==FNR || FNR>7' person1.txt file1.txt > result.txt

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

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

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

awk -- '--skip<=0' person1.txt skip=7 file1.txt skip=4 file2.txt >result.txt

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

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

答案4

$ ed file1
1,7d
0r person1
w
q

或者,作为脚本:

ed -s file1 <<'EOF'
1,7d
0r person1
w
q
EOF

或者

printf '%s\n' 1,7d '0r person1' w q | ed -s file1

如今,ex(使用vi) 比 更常见ed,尽管两者都在 POSIX 中指定,并且后者更简单。为了实现现实世界的可移植性,只需在代码示例中替换ed为。ex

相关内容