我有两个文件。一个是叫file1.txt
,另一个是person1.txt
。它们都包含一些文本行,如下例所示:
file1.txt
word1 word2 word3 word4 word5 word6 word7 word8 word9
person1.txt
givi sixarulidze
我想要做的是将前七行代码替换file1.txt
为person1.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
然后,您只需在每个文件名之前添加一个变量赋值,将变量设置awk
为skip
您想要从相应输入文件中跳过的行数。程序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