如何执行任何编辑其文件(参数)的命令;“到位”;使用bash?
我有一个文件temp.txt,我想用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
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
而BSDsort
的文档说明:
如果[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