使用sort命令对文件进行排序并覆盖它

我试图对文本文件进行排序并将排序后的文件替换为原始文件,因此我将文件也设置为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 

使用sort-o选项而不是使用重定向运算符,这将编辑适当的文件。

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 

发生这种情况是因为输入/输出文件在实际读取内容之前被截断,因此sort最终会读取已经为空的文件。

通常(即,在将命令的输出重定向到其输入文件时,由于此问题不仅发生在sort ),您可以在子shell中执行所需的命令并将其输出存储到变量,然后刷新内容文件的变量(例如,使用echo ),这样就可以将输入/输出文件的截断延迟到已经读取输入文件的位置:

 tmp=$(sort test) && echo "$tmp" > test 

另请注意,这对于大型文件来说效率不高,并且已选择&&运算符代替; 在第一个命令失败的情况下避免截断输入/输出文件。

您可以编写类似-b -o filename filename的文件 ,其中filename指定同一文件两次,您希望保存输出或覆盖原始文件。 这个命令就像,它将删除任何空格并对文件内容进行排序并覆盖到原始文件。

然后你可以通过提及cat filename来打印文件的内容,在标准输出设备上打印文件的内容作为输出。

谢谢。

Interesting Posts