当我们使用
sort file
命令时,
该文件以排序的方式显示其内容。如果我不想在 stdout 上获得任何输出,而是在输入文件中,该怎么办?
可以使用sort的
-o
、--output=FILE
选项来表示相同的输入输出文件:
sort -o file file
不重复文件名(使用 bash 大括号扩展)
sort -o file{,}
⚠️ 重要提示: 一个常见的错误是试图将输出重定向到同一个输入文件 (例如
sort file > file
)。这不起作用,因为 shell 正在进行重定向(不是 sort(1) 程序)并且输入文件(作为输出)将在给 sort(1) 程序机会之前被擦除阅读它。
sort file | sponge file
这是在以下 Fedora 软件包中:
moreutils : Additional unix utilities
Repo : fedora
Matched from:
Filename : /usr/bin/sponge
你想对文件夹和子文件夹中的所有文件进行排序并覆盖它们吗?
使用这个:
find . -type f -exec sort {} -o {} \;
这是一种(ab)使用
vim
的方法:
vim -c :sort -c :wq -E -s "${filename}"
-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
要就地排序文件,请尝试:
echo "$(sort your_file)" > your_file
如其他答案中所述,您不能直接将输出重定向回输入文件。但是您可以先评估
sort
命令,然后将其重定向回原始文件。通过这种方式,您可以实现就地排序。
同样,您也可以将此技巧应用于其他命令,例如
paste
,以实现逐行追加。
关于几个文件没有答案,所以:
sort -u file1 file2 -o file1