35

我有一个调用 grep 来处理文本文件的脚本。目前我正在做这样的事情。

$ grep 'SomeRegEx' myfile.txt > myfile.txt.temp
$ mv myfile.txt.temp myfile.txt

我想知道是否有任何方法可以进行就地处理,例如将结果存储到同一个原始文件中,而不必创建临时文件,然后在处理完成时用临时文件替换原始文件。

当然,我欢迎评论为什么应该或不应该这样做,但我主要对是否可以这样做感兴趣。在这个例子中,我使用的是grep,但我对一般的 Unix 工具很感兴趣。谢谢!

4

9 回答 9

32

sponge(在moreutilsDebian/Ubuntu 的包中)读取输入直到 EOF 并将其写入文件,因此您可以 grep 文件并将其写回自身。

像这样:

grep 'pattern' file | sponge file
于 2015-06-27T21:04:04.037 回答
18

Perl 有-i开关,所以也sedRuby

sed -i.bak -n '/SomeRegex/p' file

ruby -i.bak -ne 'print if /SomeRegex/' file

但请注意,它所做的只是在后端创建您认为看不到的“临时”文件,仅此而已。

其他方式,除了grep

awk

awk '/someRegex/' file > t && mv t file

重击

while read -r line;do case "$line" in *someregex*) echo "$line";;esac;done <file > t && mv t file
于 2010-10-20T15:55:33.793 回答
4

一般来说,这是做不到的。但是 Perl 有这个-i开关:

perl -i -ne 'print if /SomeRegEx/' myfile.txt

写入-i.bak会导致原件保存在myfile.txt.bak.

(当然,在内部,Perl 基本上只是在做你已经在做的事情——没有涉及什么特殊的魔法。)

于 2010-10-20T15:34:09.287 回答
3

不,一般来说它不能像这样在 Unix 中完成。您只能创建/截断(使用 >)或附加到文件(使用 >>)。一旦被截断,旧的内容就会丢失。

于 2010-10-20T15:32:47.593 回答
1

要使用 vim-way 就地编辑文件,请尝试:

$ ex -s +'%!grep foo' -cxa myfile.txt

或者使用sedgawk

于 2015-04-19T20:51:16.580 回答
0

大多数安装都sed可以进行就地编辑,检查手册页,您可能需要该-i标志。

于 2010-10-20T16:33:10.367 回答
0

存储在变量中,然后将其分配给原始文件:

A=$(cat aux.log | grep 'Something') && echo "${A}" > aux.log
于 2018-11-09T17:37:03.713 回答
-2

请查看我在http://petdance.com/perl/command-line-options.pdf上的幻灯片“Perl 命令行选项的现场指南”,了解更多关于使用 Perl 可以做什么的想法。

于 2010-10-20T16:08:42.433 回答
-2

猫 myfile.txt | grep 'sometext' > myfile.txt

这将在 myfile.txt 中找到一些文本并将其保存回 myfile.txt,这将完成您想要的。不确定正则表达式,但它确实适用于文本。

于 2020-07-06T08:47:51.200 回答