我有两个文件;file1
包含 -
hello world
hello bangladesh
并file2
包含 -
Dhaka in Bangladesh
Dhaka is capital of Bangladesh
我想更新file2
为 -
hello world
hello bangladesh
Dhaka in Bangladesh
Dhaka is capital of Bangladesh
这是由 -
cat file1 file2 >> file3
mv file3 file2
但是,我不想创建一个新文件。我想使用sed
它可能是可能的。
当然有可能。
(除非您还担心可能会在“幕后”创建临时文件,因为几乎所有文本编辑器都是这样工作的。我并不是说完全不可能避免任何可能的幕后临时文件创建,但是此答案未涵盖。)
这是一个符合 POSIX 的命令
ex
,使用 POSIX 指定的非可视化前身vi
.printf
仅在此处用于向编辑器提供命令。什么printf
输出是:x
是保存退出。r
是“读取指定文件的内容”。0
指定应在其后放置读入文本的行号。使用标准工具就地修改文件的方法并不多。即使他们看起来这样做,他们也可能正在使用临时文件(即 GNU
sed -i
)。ex
另一方面,会做的伎俩:ex
是一个行编辑器并vim
从它演变而来,所以这些命令可能看起来很熟悉。0r filename
做同样的事情:0r filename
:vim
在给定的地址(行号)之后插入指定的文件。这里的行号是 0,这是一种虚拟行,代表第 1 行之前的行。因此文件将被插入到任何现有文本之前。然后我们有
wq
保存和退出。如果您注意到下面关于它“非常脆弱”的评论,请对它持保留态度。如果您想在脚本中使用它,只需确保进行适当的前提条件验证(文件存在、可读/可写等)。无论如何,优秀的脚本编写者都会这样做。
更新:我已经添加
-n
以解决 OP 关于避免创建任何临时文件的担忧。假设你ex
的实现是作为vim
(大多数现代系统的情况)的一部分,这个标志将抑制正常的交换文件创建vim
。仅适用于小文件。
与 Jasen 的回答类似,这是实用程序的基础。
moreutils包中的代码海绵旨在为几乎任何程序提供就地功能,尽管是外部程序。本质上,它吸收来自 STDIN 的输入,然后将收集的输出写入文件名,但不使用重定向。
我们喜欢这个想法,所以我们创建了一个类似的工作,它在内存中收集数据,而不是像真正的海绵那样收集文件。
这是一段 shell 脚本来说明这一点:
制作:
核心 perl 代码非常短(尤其是没有错误检查,添加它可能是可取的):
在如下系统上运行:
最良好的祝愿......干杯,drl