我试图对文本文件进行排序,并用原始文件替换排序后的文件,因此我将文件也设置为 sort 命令的输出,但当我这样做时,它会清除文件内容并且文件变为空,为什么?我可以使用另一个文件来解决这个问题,但感觉不太好 :D,(我正在使用 Lubuntu。)
faav@faav-XPS-L501X:~$ cat test
A
C
B
faav@faav-XPS-L501X:~$ ls -l test
-rw-rw-r-- 1 faav faav 6 Apr 14 00:28 test
faav@faav-XPS-L501X:~$ sort test > test
faav@faav-XPS-L501X:~$ cat test
faav@faav-XPS-L501X:~$ ls -l test
-rw-rw-r-- 1 faav faav 0 Apr 14 00:28 test
答案1
使用-o
选项sort
而不是使用重定向运算符,这将就地编辑文件。
从man sort
:
-o, --output=FILE
write result to FILE instead of standard output
这是一个测试:
$ cat test.txt
A
C
B
$ sort test.txt
A
B
C
$ sort test.txt -o test.txt
$ cat test.txt
A
B
C
答案2
发生这种情况的原因是,输入/输出文件在实际读取其内容之前被截断,因此sort
最终读取一个已经是空的文件。
一般来说(即将命令的输出重定向到其输入文件时,因为此问题不仅发生在sort
),您可以在子 shell 中执行所需的命令并将其输出存储到变量中,然后将变量的内容刷新到文件(例如使用echo
),这样将输入/输出文件的截断延迟到已经读取输入文件的点:
tmp=$(sort test) && echo "$tmp" > test
还要注意,对于大文件来说,这不是很有效,并且&&
选择了运算符来代替,;
以避免在第一个命令失败的情况下截断输入/输出文件。
答案3
你可以这样写排序 -b -o 文件名 文件名,其中 filename 指定两次相同的文件,因为您希望将输出保存或覆盖到原始文件。此命令的工作原理是,它将删除任何空格并对文件内容进行排序并覆盖到原始文件。
然后你可以通过提及来打印文件的内容猫文件名,将文件内容作为输出打印到标准输出设备上。
谢谢。