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

yyhrrdl8  于 2022-10-17  发布在  Linux
关注(0)|答案(8)|浏览(237)

我想读取文件“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
m3eecexj

m3eecexj1#

在Linux上,sed -i是可行的。然而,sed实际上并不是为就地编辑而设计的;在历史上,它是一个过滤器,一个编辑管道中的数据流的程序,对于这种用途,您需要写入一个临时文件,然后将其重命名。
您得到空文件的原因是,外壳在运行命令之前打开(并截断)该文件。

wko9yo5t

wko9yo5t2#

你想要:sed -i 's/foo/bar/g' file

k3bvogb1

k3bvogb13#

你想用“sed-i”。这将进行适当的更新。

zfciruhq

zfciruhq4#

使用Perl进行就地编辑

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

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

对于许多文件

5fjcxozz

5fjcxozz5#

ed解决方案是:

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

或者没有异端邪说

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

plupiseo6#

实际上,如果您使用-i标志,sed将复制您编辑的原始行。
因此,这可能是一个更好的方式:

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

jmo0nnb37#

有一个有用的海绵命令。

海绵在打开输出文件之前会吸收所有输入。

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

wsewodh28#

我在MacOS上什么都不能用,但经过一些研究,我发现了this answer
因此,以下代码可以在MacOS上运行:

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

然而,在Linux发行版上(在我的管道中),以下命令工作正常,并且上面的命令抛出错误:

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

相关问题