是否可以在 CLI 中的文件开头添加一些文本而不创建新文件?

Is it possible to add some text at beginning of a file in CLI without making new file?

我有两个文件 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 可能是可能的。

您想在现有文件的顶部插入两行。

没有通用的方法来做到这一点。您可以将数据追加到现有文件的末尾,但除了在末尾之外,没有其他方法可以插入数据,至少在不重写插入点之后的文件部分的情况下是这样。

创建文件后,您可以覆盖其中的数据,但任何未修改数据的位置保持不变。

当您使用文本编辑器编辑文件时,它会在内存中执行更新;当您保存文件时,它可能会创建一个与旧文件同名的新文件,或者它可能会创建一个临时文件然后重命名。无论哪种方式,它都必须写入全部内容,并且原始文件将被破坏(尽管一些编辑可能会创建备份副本)。

你的方法:

cat file1 file2 >> file3
mv file3 file2

几乎就是这样做的方法(除了 >> 应该是 >;如果 file3 已经存在,你不想保留它以前的内容).

您可以使用临时文件名:

cat file1 file2 > tmp$$ && mv tmp$$ file2

tmp$$ 使用当前 shell 的进程 ID 生成几乎可以肯定是唯一的文件名(因此您不会破坏任何内容)。 && 表示如果 cat 命令失败,则不会执行 mv 命令,因此如果出现错误,您仍将拥有原始的 file2

当然有可能。

printf '%s\n' '0r file1' x | ex file2

这是一个使用 ex, the POSIX-specified non-visual predecessor to vi 的 POSIX 兼容命令。

printf 仅用于向编辑器提供命令。 printf 输出的是:

0r file1
x

x就是保存退出。

r 是 "read in the contents of the named file."

0 指定读入文本所在的行号。

N.B。此答案完全复制自

另一种解决方案
使用标准工具就地修改文件的方法并不多。即使他们看起来这样做,他们也可能正在使用临时文件(即 GNU sed -i)。

ex 另一方面,可以解决问题:

ex +'0r file2' +wq file1

ex 是一个行编辑器,vim 是从它演变而来的,因此这些命令可能看起来很熟悉。 0r filenamevim中的:0r filename做同样的事情:在给定的地址(行号)之后插入指定的文件。这里的行号是0,这是一种虚拟行,代表第1行之前的行。所以文件将被插入到任何现有文本之前。

然后我们有 wq 保存并退出。

就是这样。

N.B。此答案完全复制自 https://unix.stackexchange.com/a/414408/176227