我想读取文件“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
在 Linux 上,
sed -i
是最佳选择。不过,sed
实际上并不是为就地编辑而设计的;从历史上看,它是一个过滤器,一个编辑管道中数据流的程序,对于这种用法,您需要写入临时文件,然后重命名它。
您得到空文件的原因是 shell 在运行命令之前打开(并截断)该文件。
您想要:
sed -i 's/foo/bar/g' file
您想使用“sed -i”。这更新到位。
使用 Perl 就地编辑
perl -pi -w -e 's/foo/bar/g;' file.txt
或
perl -pi -w -e 's/foo/bar/g;' files*
对于许多文件
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
实际上,如果您使用
-i
标志,sed
将复制您编辑的原始行。
所以这可能是更好的方法:
sed -i -e 's/old/new/g' -e '/new/d' file
有一个有用的 sponge 命令。
sponge 在打开输出文件之前吸收所有输入。
$cat test.txt | sed 's/find/replace/w' | sponge test.txt
在 MacOS 上没有任何东西对我有用,但经过一番研究后我发现了这个答案。
因此以下内容适用于 MacOS:
sed -i '' -e 's/find/replace/g' teste
但是,在 Linux 发行版(在我的管道中)上,以下命令有效,并且上述命令引发了错误:
sed -i -e 's/find/replace/g' teste
在 Unix 和 Plan9 中适合您任务的另一个命令是 tee
sed 's/find/replace/'<file | tee file