如何就地对文件进行排序

Ali*_*jid 183 unix linux bash shell

当我们使用sort file命令时,文件以排序的方式显示其内容,如果我不想获得任何类型的输出但是排序文件?

Syl*_*gat 365

您可以使用文件重定向来重定向已排序的输出:

sort input-file > output_file
Run Code Online (Sandbox Code Playgroud)

或者你也可以使用-o,--output=FILE排序的选项,以指示相同的输入和输出文件:

sort -o file file
Run Code Online (Sandbox Code Playgroud)

注意:常见的错误是尝试将输出重定向到相同的输入文件(例如sort file > file).这不起作用,因为shell正在进行重定向(而不是sort(1)程序),输入文件(也作为输出)将在给sort(1)程序读取它的机会之前被删除.

  • 关于常见错误的好注意事项 (75认同)
  • 为避免重复文件名:`sort -o file {,}` (11认同)
  • 只是提到订单的重要性.从`GNU sort`信息页面:`-o OUTPUT-FILE'` - output = OUTPUT-FILE'将输出写入OUTPUT-FILE而不是标准输出.在较新的系统上,如果设置了"POSIXLY_CORRECT",则在输入文件后面不能出现`-o',例如`sort F -o F'.可移植脚本应在任何输入文件之前指定`-o OUTPUT-FILE'. (5认同)
  • @KCBaltz {} 是 [bash 大括号扩展](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) 的一部分。`-o foo{bar,baz}` 会导致 `-o foobar foobaz` 和 `-o file{,}` 会出现在 `-o file file` 中。您可以通过运行 `echo file{foo,bar}` (-> `filefoo filebar`) 来测试它 (2认同)

Tom*_*ech 56

sort命令默认将排序操作的结果打印到标准输出.为了实现"就地"排序,您可以这样做:

sort -o file file
Run Code Online (Sandbox Code Playgroud)

这将file使用已排序的输出覆盖输入.-o用于指定输出的开关由POSIX定义,因此应该可用于以下所有版本sort:

-o指定要使用的输出文件的名称,而不是标准输出.此文件可以与其中一个输入文件相同.

如果你不幸有一个sort没有-o开关的版本(Luis向我保证它们存在),你可以用标准方式实现"就地"编辑:

sort file > tmp && mv tmp file
Run Code Online (Sandbox Code Playgroud)

  • +^ 为最佳答案,也有不明确的问题,但仍处于首页排名,因此需要提升。 (2认同)

Sil*_*Fox 12

sort file | sponge file
Run Code Online (Sandbox Code Playgroud)

这是在以下 Fedora 包中:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge
Run Code Online (Sandbox Code Playgroud)

  • 使用“sudo apt install moreutils”安装后,这也适用于 Ubuntu (3认同)

小智 7

您想对文件夹和子文件夹中的所有文件进行排序并覆盖它们吗?

用这个:

find . -type f -exec sort {} -o {} \;
Run Code Online (Sandbox Code Playgroud)


Ant*_*ile 6

这是(ab)使用的一种方法vim

vim -c :sort -c :wq -E -s "${filename}"
Run Code Online (Sandbox Code Playgroud)

-c :sort -c :wq部分在文件打开后调用 vim 命令。 -E并且-s是必要的,以便 vim 在不绘制到终端的“无头”模式下执行。

与该sort -o "${filename}" "${filename}"方法相比,这几乎没有任何好处,只是它只接受一次文件名参数。


这对我formatter在文件nanorc条目中实现指令很有用.gitignore。这是我用来做的:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s
Run Code Online (Sandbox Code Playgroud)

  • 你在你的 `nanorc` 中使用 vim 吗?哦,讽刺。 (9认同)