[英]How to sort a file in-place?
当我们使用sort file
命令时,文件以排序的方式显示其内容。 如果我不想在标准输出上获得任何输出,而是在输入文件中获得任何输出怎么办?
您可以使用-o
, --output=FILE
选项来指示相同的输入和输出文件:
sort -o file file
不重复文件名(使用bash 大括号扩展)
sort -o file{,}
⚠️重要提示:一个常见的错误是尝试将输出重定向到相同的输入文件(例如sort file > file
)。 这不起作用,因为 shell 正在进行重定向(不是sort(1)程序),输入文件(也作为输出)将在给sort(1)程序读取它的机会之前被删除。
sort
命令默认将排序操作的结果打印到标准输出。 为了实现“就地”排序,您可以这样做:
sort -o file file
这会用排序的输出覆盖输入file
。 用于指定输出的-o
开关由 POSIX 定义,因此应该在所有版本的sort
上都可用:
-o 指定要使用的输出文件的名称,而不是标准输出。 该文件可以与输入文件之一相同。
如果您不幸拥有一个没有-o
开关的sort
版本( Luis向我保证它们存在),您可以以标准方式实现“就地”编辑:
sort file > tmp && mv tmp file
sort file | sponge file
这是在以下 Fedora 包中:
moreutils : Additional unix utilities
Repo : fedora
Matched from:
Filename : /usr/bin/sponge
这是(ab)使用vim
的一种方法:
vim -c :sort -c :wq -E -s "${filename}"
-c :sort -c :wq
部分在文件打开后调用 vim 命令。 -E
和-s
是必要的,以便 vim 以不绘制到终端的“无头”模式执行。
与sort -o "${filename}" "${filename}"
方法相比,这几乎没有任何好处,只是它只接受文件名参数一次。
这对我在.gitignore
文件的nanorc
条目中实现formatter
指令很有用。 这是我用来做的:
syntax "gitignore" "\.gitignore$"
formatter vim -c :sort -c :wq -E -s
您想对文件夹和子文件夹中的所有文件进行排序以覆盖它们吗?
用这个:
find . -type f -exec sort {} -o {} \;
要对文件进行就地排序,请尝试:
echo "$(sort your_file)" > your_file
如其他答案中所述,您不能直接将输出重定向回输入文件。 但是您可以先评估sort
命令,然后将其重定向回原始文件。 通过这种方式,您可以实现就地排序。
同样,您也可以将此技巧应用于其他命令,例如paste
以实现逐行追加。
没有关于几个文件的答案,所以:
sort -u file1 file2 -o file1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.