我想在OS x上用sed编辑一个文件,我正在使用以下命令:

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

输出结果被发送到终端。File.txt未被修改。使用下面的命令将更改保存到file2.txt:

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

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

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

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

当前回答

这将创建备份文件。例如,sed -i -e 's/hello/hello world/' testfile为我创建了一个备份文件testfile-e,在同一个目录下。

其他回答

你可以使用:

sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>

例子:

sed -i -e 's/Hello/Bye/' file.txt

这在Mac上完美无缺。

sed -i -- "s/https/http/g" file.txt

您可以像前面建议的那样,对sed使用-i”(——in-place)。参见:-i in-place参数,但请注意-i选项是非标准FreeBSD扩展,可能在其他操作系统上不可用。其次,sed是一个流编辑器,而不是文件编辑器。


另一种方法是在Vim Ex模式中使用内置替换,例如:

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

对于多个文件:

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

要递归地编辑所有文件,可以使用**/*。*如果shell支持(通过shop -s globstar启用)。


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

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

这将创建备份文件。例如,sed -i -e 's/hello/hello world/' testfile为我创建了一个备份文件testfile-e,在同一个目录下。

我在MacOS上也有类似的问题

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

不管用,但是

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

工作得很好。