我想读取文件“Test.”,进行一些“查找和替换”,并用结果覆盖“Test.”到目前为止,我更接近的是:
$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
8条答案
按热度按时间m3eecexj1#
在Linux上,
sed -i
是可行的。然而,sed
实际上并不是为就地编辑而设计的;在历史上,它是一个过滤器,一个编辑管道中的数据流的程序,对于这种用途,您需要写入一个临时文件,然后将其重命名。您得到空文件的原因是,外壳在运行命令之前打开(并截断)该文件。
wko9yo5t2#
你想要:
sed -i 's/foo/bar/g' file
k3bvogb13#
你想用“sed-i”。这将进行适当的更新。
zfciruhq4#
使用Perl进行就地编辑
或
对于许多文件
5fjcxozz5#
ed
解决方案是:或者没有异端邪说
plupiseo6#
实际上,如果您使用
-i
标志,sed
将复制您编辑的原始行。因此,这可能是一个更好的方式:
jmo0nnb37#
有一个有用的海绵命令。
海绵在打开输出文件之前会吸收所有输入。
wsewodh28#
我在MacOS上什么都不能用,但经过一些研究,我发现了this answer。
因此,以下代码可以在MacOS上运行:
然而,在Linux发行版上(在我的管道中),以下命令工作正常,并且上面的命令抛出错误: