使用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来打印文件的内容,在标准输出设备上打印文件的内容作为输出。
谢谢。