如何执行任何编辑其文件(参数)的命令;“到位”;使用bash?

如何执行任何编辑其文件(参数)的命令;“到位”;使用bash?,bash,command-line,sorting,Bash,Command Line,Sorting,我有一个文件temp.txt,我想用bash中的sort命令对它进行排序 我希望排序结果替换原始文件 这不起作用例如(我得到一个空文件): 这可以在一行中完成,而不必复制到临时文件吗 编辑:-o选项对于排序非常酷。我在问题中使用了sort作为例子。我在使用其他命令时遇到了相同的问题: uniq temp.txt > temp.txt. 有更好的通用解决方案吗?请阅读非交互式编辑器。给你,一行: sort temp.txt > temp.txt.sort && mv

我有一个文件temp.txt,我想用bash中的
sort
命令对它进行排序

我希望排序结果替换原始文件

这不起作用例如(我得到一个空文件):

这可以在一行中完成,而不必复制到临时文件吗


编辑:
-o
选项对于
排序
非常酷。我在问题中使用了
sort
作为例子。我在使用其他命令时遇到了相同的问题:

uniq temp.txt > temp.txt.

有更好的通用解决方案吗?

请阅读非交互式编辑器。

给你,一行:

sort temp.txt > temp.txt.sort && mv temp.txt.sort temp.txt
从技术上讲,不需要复制到临时文件,“mv”命令应该是即时的。

使用参数
--output=
-o

sort temp.txt -o temp.txt
刚刚在FreeBSD上试用过:

sort temp.txt -otemp.txt

如果坚持使用
sort
程序,就必须使用中间文件——我认为
sort
在内存中没有排序选项。使用stdin/stdout的任何其他技巧都将失败,除非您能够保证sort的stdin的缓冲区大小足以容纳整个文件


编辑:我真丢脸
sort temp.txt-o temp.txt非常有效。

许多人提到了-o选项。这是手册页部分

从手册页:

   -o output-file
          Write output to output-file instead of to the  standard  output.
          If  output-file  is  one of the input files, sort copies it to a
          temporary file before sorting and writing the output to  output-
          file.

排序
需要先查看所有输入,然后才能开始输出。因此,
sort
程序可以方便地提供修改文件的选项:

sort temp.txt -o temp.txt
$ sort -u -o file !#$
具体而言,报告说:

通常,sort会在打开输出文件之前读取所有输入,因此您可以使用
sort-of F
cat F | sort-of
等命令对文件进行安全排序。但是,
sort
--merge
-m
)可以在读取所有输入之前打开输出文件,因此像
cat F | sort-m-o F-G
这样的命令是不安全的,因为sort可能在读取
cat
之前开始写入
F

而BSD
sort
的文档说明:

如果[the]输出文件是输入文件之一,则在排序并将输出写入[the]输出文件之前,sort会将其复制到临时文件

诸如
uniq
之类的命令可以在完成输入读取之前开始写入输出。这些命令通常不支持就地编辑(而且它们更难支持此功能)

您通常使用临时文件来解决这个问题,或者如果您绝对希望避免使用中间文件,您可以在写入完整结果之前使用缓冲区来存储它。例如,使用
perl

uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'
uniq temp.txt|perl-e'unde$/;$|=;打开(OUT,“>temp.txt”);打印出来

在这里,perl部分读取变量
$\ucode>中的
uniq
的完整输出,然后用该数据覆盖原始文件。您可以在自己选择的脚本语言中执行同样的操作,甚至可以在Bash中执行。但是请注意,它需要足够的内存来存储整个文件,这在处理大型文件时是不可取的。

这将是高度内存限制的,但您可以使用awk将中间数据存储在内存中,然后将其写回

uniq temp.txt | awk '{line[i++] = $0}END{for(j=0;j<i;j++){print line[j]}}' > temp.txt

uniq temp.txt | awk'{line[i++]=$0}END{for(j=0;j要添加
uniq
功能,有哪些缺点:

sort inputfile | uniq | sort -o inputfile

这里有一个更通用的方法,与uniq、sort等一起使用

{ rm file && uniq > file; } < file
{rm file&&uniq>file;}
保证其本身就是一个答案

引自网页:

到目前为止,moreutils中最通用的工具可能是海绵(1),它允许您执行以下操作:

% sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd
但是,
海绵
也会遇到同样的问题,如果
海绵
之前管道中的任何命令失败,那么原始文件将被重写

$ mistyped_command my-important-file | sponge my-important-file
mistyped-command: command not found

哦,
我的重要文件
不见了。

我喜欢
排序文件-o文件
的答案,但不想重复键入相同的文件名

使用BASH:

按enter键时获取当前行的第一个参数

一个独特的排序:

sort temp.txt -o temp.txt
$ sort -u -o file !#$

获取当前行中的最后一个arg。

使用更常见的
sed
作为
海绵的替代:

sed -ni r<(command file) file

例子 另一个解决方案:

uniq file 1<> file
uniq文件1文件

Hm.我仍然会将temp.txt.sort称为临时文件。这段代码是有风险的,因为如果排序由于任何原因失败而没有完成其工作,则原始文件将被覆盖。磁盘空间不足可能是一个原因,或者是一个信号(用户点击CTRL-C)。如果您想使用类似于此的内容,请使用&(逻辑和)而不是;因为使用该选项将确保如果命令失败,下一个命令将不会执行。例如:cp backup.tar/root/backup.tar&&rm backup.tar如果您没有复制权限,您将是安全的,因为文件不会被删除更改我的答案以考虑您的建议,谢谢我将Q读为“就位”但第二次阅读让我相信他并不是真的在问这个问题。这是一个答案。我实际上想知道是否有一个通用的解决方案来解决这个问题。例如,如果我想找到一个文件中的所有UNIQ行“就地”,我做不到-oIt不是泛型的,但是你可以使用-u和GNU排序来查找唯一的行。如果有人解决了这个问题,允许使用例如
排序--inplace*.txt
?那太疯狂了cool@sehe试试这个:
find.-name\*.txt-exec sort{}-o{}\;
另一种通用方法,使用moreutils中的
scape
cat file | frobnite | scape file
@Tobu:为什么不将其作为一个单独的答案提交呢?可能需要注意的是,这并不一定会保留文件权限。您的umask决定了新权限是什么。棘手的一个问题。您能解释一下怎么做吗它能正常工作吗?@patryk.beza:顺序:输入FD被打开
$ cat file
d
b
c
b
a

$ ip_cmd sort file
$ cat file
a
b
b
c
d

$ ip_cmd uniq file
$ cat file
a
b
c
d

$ ip_cmd tac file
$ cat file
d
c
b
a

$ ip_cmd
bash: 1: You must specify a command
$ ip_cmd uniq
bash: 2: You must specify a file
uniq file 1<> file