在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