如何清除文件中的文本?

rɑː*_*dʒɑ 113 command-line bash files

如何在不打开文本文件的情况下清除文本文件中存在的文本?

我的意思是,例如我有一个文件,hello.txt其中包含一些文本数据,如何在不打开该文件的情况下清除该文件中的全部文本

我的意思是不使用任何编辑器,如 nano、Gedit 等。

rɑː*_*dʒɑ 184

只要打开你的终端与CTRL+ ALT+T和类型

 > hello.txt
Run Code Online (Sandbox Code Playgroud)

就是这样,您在该文件中的数据将被清除,甚至无需打开它。

例子:

在此处输入图片说明

  • 从技术上讲,该文件将被打开。只是不在编辑器中。 (8认同)
  • @souravc John 是正确的,文件将被打开。Shell 打开一个带有标志“O_WRITE|O_TRUNC”的重定向文件“>”。事实上,这在“bash”手册的“重定向输出”部分中明确指出:“如果文件不存在,则创建它;如果存在,则将其截断为零大小。” (2认同)

era*_*man 48

截断文件的最简单方法是将 shell no-op 命令 ( :)的输出重定向到要擦除的文件。

: > hello.txt
Run Code Online (Sandbox Code Playgroud)

  • 它可能不是最简单的(相对于`>`),但肯定是最快的..我想知道为什么在这个备受关注的问题的任何答案中都没有提到它..在这里,采取+1.. (2认同)

Don*_*ggs 23

我必须一直使用日志文件执行此操作。我发现的最简单的方法是使用以下命令:

cat /dev/null > hello.txt
Run Code Online (Sandbox Code Playgroud)

这将删除文件的所有内容,并为您留下一个空文件,而无需在编辑器中打开它,选择文本,任何此类内容。更具体地说,它的作用是用“/dev/null”的内容替换文件的内容,或者什么都不替换。实际上,它非常光滑。

唯一需要注意的是,您当前登录的用户必须具有对该文件的写权限。


sou*_* c. 14

我也将使用像 rajagenupula 的回答那样的重定向。但是有更多的灵活性。打开终端并输入,

cat > hello.txt
Run Code Online (Sandbox Code Playgroud)

然后按Ctrl+ C。它将清除以前的文件。如果你想要这么多,那很好。

如果您愿意,可以在擦除文件后执行更多操作。通过这种方式,您不仅可以在不打开文件的情况下擦除文件,还可以在文件中以正确的格式写入几行。假设您希望在擦除文件后写入“Ubuntu 是最好的操作系统”,只需执行

cat > hello.txt
Ubuntu is the 
best OS
Run Code Online (Sandbox Code Playgroud)

然后按Ctrl+ C。现在之前的文件被清除了。同时,正如我所说的那样,单词分为两行。

看例子:

在此处输入图片说明


Avi*_*Raj 5

如果一个文件与名称创建hello.txt的和在终端然后提供一些文本下面的命令ctrl+ alt+t将删除所有文本hello.txt的文件,

echo "" > hello.txt
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Ser*_*nyy 5

另一种方法-cp/dev/null该文件

xieerqi:$ cat testFile.txt                                                                                        
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda1      115247656 83100492  26269816  76% /
none                   4        0         4   0% /sys/fs/cgroup
udev             2914492        4   2914488   1% /dev
tmpfs             585216     1152    584064   1% /run
none                5120        0      5120   0% /run/lock
none             2926072    98096   2827976   4% /run/shm
none              102400       76    102324   1% /run/user

xieerqi:$ cp /dev/null testFile.txt                                                                               

xieerqi:$ cat testFile.txt

xieerqi:$ 
Run Code Online (Sandbox Code Playgroud)

为什么会这样?这是如何工作的?该testFile.txt将被打开O_WRONLY|O_TRUNC,将被截断,该装置中的内容被丢弃和大小设置为零-标志,而如果该文件存在的手段。这与>shell中的运算符打开该运算符右侧的文件的标志相同。

接下来,cp将尝试从/dev/null读取 0 字节后读取将简单地关闭两个文件,从而testFile.txt截断并有效删除内容。

知道了这一点,理论上我们可以使用任何允许我们打开带有O_TRUNC. 例如这个:

dd of=testFile.txt count=0
Run Code Online (Sandbox Code Playgroud)

这里的小区别是dd根本不会执行任何操作read()。这个dd版本的一大优点是它是 POSIXly 可移植的。该DD规范状态:

如果还没有指定 seek= expr 转换,如果指定了显式 of= 文件操作数,则在复制开始之前应截断输出文件,除非指定了 conv= notrunc。

相比之下,cp /dev/null testFile.txt它不一定是可移植的,因为cp 的 POSIX 规范涵盖了只有在 source_file 是非常规的并且指定了-r/-R标志时才会发生的情况(非常感谢Stephen Kitt指出这一点),而不是当-r-R被省略时会发生什么,这是这里的情况。然而,似乎至少 GNUcp默认使用相同规范中的规则 3,即截断现有文件而不更改其类型。


Win*_*nix 5

不是最短的答案,但...

此答案基于Super User 的另一个答案。虽然不是最短的 bash 命令,truncate但对于普通新手来说是最易读的:

$ echo Hello > Hello.txt
$ echo World! >> Hello.txt
$ cat Hello.txt
Hello
World!
$ truncate -s 0 Hello.txt
$ ll Hello.txt
-rw-rw-r-- 1 rick rick 0 Mar 20 17:32 Hello.txt
Run Code Online (Sandbox Code Playgroud)

truncate此处与命令一起使用的参数:

  • "-s" 设置大小
  • “0”大小将为零

清除除前 10,000 个字节以外的所有内容

的一个优点truncate是您可以指定要保留的数量,而不仅仅是零:

$ truncate -s 10000 Hello.txt
Run Code Online (Sandbox Code Playgroud)

... 将截断前 10,000 个字节之后的所有内容。如果程序发疯并将许多兆字节的数据转储到一个小日志文件中,这可能很有用:

  • 运行truncate命令以获得 10K 的合理更大的正常大小
  • 使用文本编辑器打开文件,然后按 End
  • 突出显示并PgUp删除不属于的剩余字节(通常可以通过 ASCII 垃圾字符识别)。