是否可以在 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 filename
和vim
中的:0r filename
做同样的事情:在给定的地址(行号)之后插入指定的文件。这里的行号是0,这是一种虚拟行,代表第1行之前的行。所以文件将被插入到任何现有文本之前。
然后我们有 wq
保存并退出。
就是这样。
N.B。此答案完全复制自 https://unix.stackexchange.com/a/414408/176227
我有两个文件 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 filename
和vim
中的:0r filename
做同样的事情:在给定的地址(行号)之后插入指定的文件。这里的行号是0,这是一种虚拟行,代表第1行之前的行。所以文件将被插入到任何现有文本之前。
然后我们有 wq
保存并退出。
就是这样。
N.B。此答案完全复制自 https://unix.stackexchange.com/a/414408/176227