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

Awk 是否可以在CLI中的文件开头添加一些文本而不创建新文件?,awk,sed,text-editor,text-formatting,Awk,Sed,Text Editor,Text Formatting,我有两个文件file1包含- hello world hello bangladesh 和file2包含- Dhaka in Bangladesh Dhaka is capital of Bangladesh 我想将新的文件2作为- hello world hello bangladesh Dhaka in Bangladesh Dhaka is capital of Bangladesh 这项工作由以下人士完成— cat file1 file2 >> file3 m

我有两个文件
file1
包含-

hello world
hello bangladesh  
file2
包含-

Dhaka in Bangladesh
Dhaka is capital of Bangladesh  
我想将新的
文件2
作为-

hello world
hello bangladesh 
Dhaka in Bangladesh
Dhaka is capital of Bangladesh
这项工作由以下人士完成—

cat file1 file2 >> file3
mv file3 file2  

但是,我不想创建新文件。我想使用sed是可能的。

您希望在现有文件的顶部插入两行

printf '%s\n' '0r file1' x | ex file2
没有一般的方法可以做到这一点。您可以将数据附加到现有文件的结尾,但除了在结尾插入数据之外,没有其他方法可以插入数据,至少在插入点之后不重写文件的部分

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

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

您的方法:

cat file1 file2 >> file3
mv file3 file2
基本上就是这样做的(除了
>
应该是
;如果
文件3
已经存在,您不想保留它以前的内容)

您可以使用临时文件名:

cat file1 file2 > tmp$$ && mv tmp$$ file2
tmp$$
使用当前shell的进程ID生成一个几乎肯定是唯一的文件名(这样您就不会出错)。
&
意味着如果
cat
命令失败,将不会执行
mv
命令,因此,如果出现错误,您仍然可以使用原始的
文件2

确保这是可能的

printf '%s\n' '0r file1' x | ex file2
这是一个兼容POSIX的命令,使用

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

0r file1
x
x
保存并退出

r
是“读取指定文件的内容”

0
指定应放置读入文本的行号

注意:此答案完全抄袭自

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

另一方面,
ex
会起到以下作用:

ex +'0r file2' +wq file1
ex
是一个行编辑器,
vim
是从它发展而来的,因此这些命令看起来很熟悉<代码>0r文件名的作用与
中的
:0r文件名
:在给定地址(行号)后插入指定的文件。这里的行号是0,这是一种虚拟线,表示第1行之前的行。因此,该文件将插入任何现有文本之前

然后我们有
wq
,它保存并退出

就这样


注意:这个答案完全是从

简单编写
cat文件1文件2>>文件2
复制的?这对我的工作很好console@SourceOverflow:你确定吗?我收到一条错误消息“
cat:file2:input file是output file
”。也许您打算编写
cat file1>>file2
——但这会将
file1
的内容附加到
file2
的末尾。OP想要在
file2
@KeithThompson的顶部插入
file1
的内容。不,我完全按照我描述的那样做了。我也收到了“错误”(警告?),但仍然有效。我不能保证每一个解释器都是这样,并且没有竞争条件(这就是我刚刚发表评论的原因)@SourceOverflow:对不起,当我看到错误消息时,我没有检查文件内容。但是当我在我的系统上运行该命令时(使用bash4.4.0),
file2
中的行顺序错误。(试图弄清楚到底发生了什么,我的头很痛。)@KeithThompson可能是某种比赛条件?老实说,我很好。我本来希望
ex
创建一个新文件,但(至少在我的系统上,使用Vim 8.0提供的
ex
)它会覆盖原始文件,使其具有相同的inode编号。使用
vim
执行等效操作会创建一个新文件。
ex
会创建一个与输入文件大小相同的内部缓冲区,因此,如果您试图避免由于内存原因创建临时文件,那么请使用YMMV!通过将所有输入读取到一个数组中,关闭输入文件,然后在结束部分将其写回,可以对awk执行相同的操作。我希望GNU sed至少有一些符文的组合可以让它做同样的事情。在中介绍了在不缓冲整个文件的情况下执行此操作的方法。