在 Linux 上使用 sed 进行文本替换(从文件读取并保存到同一文件)

问题描述 投票:0回答:9

我想读取文件“teste”,进行一些“查找和替换”并用结果覆盖“teste”。到目前为止我更接近的是:

$cat teste
I have to find something
This is hard to find...
Find it wright now!

$sed -n 's/find/replace/w teste1' teste

$cat teste1
I have to replace something
This is hard to replace...

如果我尝试像这样保存到同一个文件:

$sed -n 's/find/replace/w teste' teste

或:

$sed -n 's/find/replace/' teste > teste

结果将是一个空白文件...

我知道我错过了一些非常愚蠢的东西,但欢迎任何帮助。


更新:根据人们给出的提示和此链接:http://idolinux.blogspot.com/2008/08/sed-in-place-edit.html这是我更新的代码:

sed -i -e 's/find/replace/g' teste 
bash unix sed command-line-interface
9个回答
47
投票

在 Linux 上,

sed -i
是最佳选择。不过,
sed
实际上并不是为就地编辑而设计的;从历史上看,它是一个过滤器,一个编辑管道中数据流的程序,对于这种用法,您需要写入临时文件,然后重命名它。

您得到空文件的原因是 shell 在运行命令之前打开(并截断)该文件。


22
投票

您想要:

sed -i 's/foo/bar/g' file


6
投票

您想使用“sed -i”。这更新到位。


2
投票

使用 Perl 就地编辑

perl -pi -w -e 's/foo/bar/g;' file.txt

perl -pi -w -e 's/foo/bar/g;' files*

对于许多文件


1
投票

ed
解决方案是:

ed teste <<END
1,$s/find/replace/g
w
q
END

或者没有heredoc

printf "%s\n" '1,$s/find/replace/g' w q | ed teste

1
投票

实际上,如果您使用

-i
标志,
sed
将复制您编辑的原始行。

所以这可能是更好的方法:

sed -i -e 's/old/new/g' -e '/new/d' file

1
投票

有一个有用的 sponge 命令。

sponge 在打开输出文件之前吸收所有输入。

$cat test.txt | sed 's/find/replace/w' | sponge test.txt

1
投票

MacOS 上没有任何东西对我有用,但经过一番研究后我发现了这个答案

因此以下内容适用于 MacOS

sed -i '' -e 's/find/replace/g' teste 

但是,在 Linux 发行版(在我的管道中)上,以下命令有效,并且上述命令引发了错误:

sed -i -e 's/find/replace/g' teste 

0
投票

在 Unix 和 Plan9 中适合您任务的另一个命令是 tee

sed 's/find/replace/'<file | tee file
© www.soinside.com 2019 - 2024. All rights reserved.