在OS X上就地编辑sed

我想在OS X上用sed编辑一个文件。我正在使用下面的命令:

sed 's/oldword/newword/' file.txt 

输出被发送到terminal。 file.txt没有被修改。 使用此命令将更改保存到file2.txt中

 sed 's/oldword/newword/' file1.txt > file2.txt 

但是我不想要另一个文件。 我只想编辑file1.txt 。 我该怎么做?

我已经尝试了-i标志。 这会导致以下错误:

 sed: 1: "file1.txt": invalid command code f 

您可以通过为后缀文件添加后缀来正确使用-i标志。 扩展你的例子:

 sed -i.bu 's/oldword/newword/' file1.txt 

会给你两个文件:一个名称为file1.txt,包含replace,另一个名称为file1.txt.bu,它具有原始内容。

温和的危险

如果要破坏性地覆盖原始文件,请使用以下内容:

 sed -i '' 's/oldword/newword/' file1.txt ^ note the space 

由于行被parsing的方式, 因为参数是零长度,所以在选项标志和它的参数之间需要一个空格

除了可能摧毁你的原创,我不知道任何进一步的欺骗sed这种方式的危险。 但是需要注意的是,如果这个sed调用是脚本的一部分,那么Unix Way™(恕我直言)就是非破坏性地使用sed ,testing它是否干净地退出,然后才删除无关的文件。

我有类似的问题与MacOS

 sed -i '' 's/oldword/newword/' file1.txt 

不起作用,但是

 sed -i"any_symbol" 's/oldword/newword/' file1.txt 

效果很好。

你可以使用-i''--in-place )来--in-place sed 。 请参阅: -i in-place参数 ,但请注意-i选项是非标准FreeBSD扩展,可能在其他操作系统上不可用。 其次sed是一个文件编辑器,而不是文件编辑器 。


另一种方法是在Vim Ex模式下使用内置的replace,如:

 $ ex +%s/foo/bar/g -scwq file.txt 

和多个文件:

 $ ex +'bufdo!%s/foo/bar/g' -scxa *.* 

要recursion地编辑所有文件,你可以使用**/*.*如果shell支持的话)(由shopt -s globstar启用)。


另一种方法是使用gawk及其新的“inplace”扩展名,例如:

 $ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1